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;
}
Другие вопросы по тегам