C简单的字符串程序无法编译

时间:2013-01-04 09:47:17

标签: c string strlen

#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 个答案:

答案 0 :(得分:2)

这是一个问题:

char name[]="Andrew";
char surname[]="Jones";
char result[80];
wynik=Jones(name, surname);

这会调用带有字符数组的Jones()(它会衰减到字符指针),但声明该函数只接受单个字符。

您应该将函数更改为char *name, char *surname,因为它似乎确实需要字符串。

此外,你不能像在Jones()中那样返回一个字符数组,你需要阅读很多关于如何在C中处理字符串的内容。

此外,wynik看起来未声明,这也会使其无法构建。

答案 1 :(得分:1)

有一些错误:

char Jones(char, char);

这只需要一个字符,而不是字符串所需的字符*。

result=Jones(name, surname);

这里的结果是一个数组。在C中,您无法分配数组。

char Jones(char name, char surname)
{ char result[80];
...
return result;
}

这里返回result这是一个局部变量。但是要返回一个字符串,你需要返回一个char *。但是char *会指向Jones函数中的局部变量,该函数在函数结束时不再有效。一种解决方案是传入一个缓冲区,您可以在其中写入调用者拥有的结果。 用于组合surename和name的算法也是错误的,你永远不会对surename做任何事情。

你需要这样做:

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缓冲区,则很容易溢出结果缓冲区。

答案 2 :(得分:0)

1)namesurname是char数组而不是单个char,因此您必须更改函数Jones()的输入参数类型,输入参数类型应为{{1 (char数组)或char name[](指向char数组的指针)

2)您无法在函数中返回本地和静态定义的数组。如果你想从函数中返回一个字符串,那么字符串应该是常量,或者应该是一个动态分配的缓冲区(char *namemalloccalloc)到函数中两种情况下,函数类型应为realloc而不是char *Jonas()

或者您可以通过输入参数传递char Jonas()数组。在这种情况下,您可以将其填入函数。

result

并在主要内容:

void Jones(char *name, char *surname, char *result)

3)以下char result[80]; Jones(names, surname, result); 循环遗漏了一些东西

for

元素for (int i=0; i<50; i++) { result[length+i] = name[i]; } 到元素result的{​​{1}}元素包含垃圾,因为0数组未启动。所以当你length result数组时,你会得到打印的垃圾。您必须在printf数组

中的result0之间启动元素

答案 3 :(得分:0)

#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;
}