C простая строковая программа не компилируется
#include <stdio.h>
#include <string.h>
char Jones(char, char);
int main() {
char name[]="Andrew";
char surname[]="Jones";
char result[80];
result=Jones(name, surname);
puts(result);
return 0;
}
char Jones(char name, char surname)
{
char result[80];
int length;
length = strlen(surname);
for (int i=0; i<50; i++)
{
result[length+i] = name[i];
}
return result;
}
Программа не компилируется, и я не знаю почему. Предполагается прочитать две строки и поменять их местами. Должен отображаться, например. "Джонс Эндрю".
4 ответа
Вот одна проблема:
char name[]="Andrew";
char surname[]="Jones";
char result[80];
wynik=Jones(name, surname);
Это звонки Jones()
с символьными массивами (которые будут затухать в символьных указателях), но объявлена функция, принимающая только одиночные символы.
Вы должны изменить функцию, чтобы принять char *name, char *surname
, поскольку он действительно, кажется, ожидает строк.
Кроме того, вы не можете вернуть массив символов, как вы делаете в Jones()
, вам нужно прочитать немного о том, как работать со строками в C.
Также, wynik
выглядит необъявленным, это также сделает его неспособным построить.
Там есть несколько ошибок:
char Jones(char, char);
Это займет всего один символ, а не символ *, который вам нужен для строки.
result=Jones(name, surname);
Здесь результат - массив. В C вы не можете присвоить массиву.
char Jones(char name, char surname)
{ char result[80];
...
return result;
}
Здесь вы вернетесь result
которая является локальной переменной. Но чтобы вернуть строку, вам нужно вернуть символ *. Но этот символ * будет указывать на локальную переменную внутри функции Джонса, которая больше не действует после завершения функции. Одним из решений является передача в буфер, в который вы записываете результат, которым владеет вызывающая сторона. Ваш алгоритм объединения верного имени и имени также неверен, вы никогда ничего не делаете с верным именем.
Вам нужно сделать это:
char *Jones(char*, char* , char *);
int main() {
char name[]="Andrew";
char surname[]="Jones";
char result[80];
char *p;
p = Jones(name, surname, result);
puts(p);
return 0;
}
char *Jones(char *name, char *surname, char *result)
{
int length;
int i,k;
length = strlen(surname);
for (i=0; i<length ; i++)
{
result[i] = surname[i];
}
result[i++] = ' '; //add a space
length = strlen(name);
for (k=0; k<length ; k++, i++)
{
result[i] = name[k];
}
result[i] = 0; //add nul terminator to end the string
return result;
}
Конкатенация может быть упрощена разными способами, например,
strcpy(result, surename);
strcat(result, " ");
strcat(result, name);
или функция Джонс может просто сделать:
sprintf(result, "%s %s", surename, name);
Во всех случаях функция довольно хрупкая, так как легко переполнить буфер результатов, если вы передаете что-то еще, что не вписывается в result
буфер.
1) name
а также surname
являются массивом символов, а не одним символом, поэтому вы должны изменить типы входных параметров вашей функции Jones()
типы входных параметров должны быть char name[]
(массив символов) или char *name
(указатель на массив символов)
2) Вы не можете вернуть массив, определенный локально и статически в функции. и если вы хотите вернуть строку из функции, строка должна быть постоянной или она должна быть динамически размещена в буфере (с malloc
, calloc
, realloc
) в функцию А для обоих случаев тип функции должен быть char *Jonas()
и не char Jonas()
Или вы можете передать result
массив через входной параметр. и в этом случае вы можете заполнить его в функции.
void Jones(char *name, char *surname, char *result)
и в основном:
char result[80];
Jones(names, surname, result);
3) следующее for
в петле чего-то не хватает
for (int i=0; i<50; i++)
{
result[length+i] = name[i];
}
result
элементы из элемента 0
стихия length
содержат мусор, потому что result
массив не инициируется. так что когда ты printf
result
Массив вы получите распечатанные вещи. Вы должны инициировать элементы между 0
в length
в result
массив
#include <stdio.h>
#include <string.h>
char* Jones(char*, char*);
int main() {
char name[]="Andrew";
char surname[]="Jones";
puts(Jones(name,surname));
return 0;
}
char* Jones(char *name, char *surname)
{
strcat(surname," ");
strcat(surname,name);
return surname;
}