-1
#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

4 回答 4

2

这是一个问题:

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

这使用字符数组调用Jones()(将衰减为字符指针),但该函数被声明为仅接受单个字符。

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

此外,您不能像在 in 中那样返回字符数组Jones(),您需要阅读大量有关如何在 C 中使用字符串的信息。

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

于 2013-01-04T09:50:17.273 回答
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缓冲区。

于 2013-01-04T09:52:44.837 回答
0

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

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数组时,您会打印出垃圾。您必须在数组中的0to之间启动元素lengthresult

于 2013-01-04T10:05:06.683 回答
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;
}
于 2013-01-04T11:07:33.353 回答