0

我对C相当陌生,我正在尝试编写一个简单的程序来连接两个字符串。在我的 Linux 机器上运行它时,我得到以下异常:

test.c:12:10: 错误:'strcat' 的类型冲突</p>

你能帮我理解我在这里缺少什么吗:

#include<stdio.h>
#include<string.h>

void main() {
  // string concatenation
  char str1[] = {'S', 'h'};
  char str2[] = {'X', 'y'};
  strcat(str1, str2);
}

void strcat(char str1[], char str2[]) {
  int index;
  int str1_length = strlen(str1);
  for(index=0; index<strlen(str2); index++) {
    str1[index + str1_length] = str2[index];
  }
}
4

10 回答 10

5

strcat没有标准签名

char *strcat(char *dest, const char *src);

如果要包含,则需要使其匹配string.h。或者,只需给您的实现一个不同的名称(my_strcat例如)。

您可能还希望以空值终止您的测试字符串 -strlen否则这些调用会给您带来非常有趣的结果。此外,为避免写到第一个字符串分配内存的末尾(从而导致未定义的行为),请确保给它足够的空间以容纳末尾的第二个字符串。

于 2013-01-04T06:19:33.957 回答
2

您的代码中有很多错误。首先,字符串 str1 和 str2 应该以 null 结尾。您可以通过将其声明更改为

char str1[] = "Sh";
char str2[] = "Xy";

或者

char str1[] = {'S', 'h', '\0'};
char str2[] = {'X', 'y', '\0'};

其次,strcat是一个保留名称,因此您的 main 函数不会调用您的版本,而是在头文件中找到的版本<string.h>。您可以通过重命名函数或不包含 header 来纠正此问题string.h。如果你做第二个,你也应该实现这个函数strlen,因为它在string.h.

于 2013-01-04T08:15:52.277 回答
2

除了其他人所说的名称冲突之外,您也没有正确的字符串。

在 C 中,字符串以空终止符 ( \0) 结尾。

你已经用这种方式制作了你的字符串:

char str1[] = {'S', 'h'};

所以它只有两个字符,S 和 h。

要使字符串可由函数使用,例如strlen,它必须有一个空终止符。
我建议:

char str1[] = {'S', 'h', '\0'};
于 2013-01-04T06:32:22.173 回答
2

C 语言中有预定义的函数“strcat”(在 string.h 中),所以当您尝试调用 strcat 时,编译器似乎在该 inbuild 函数和您定义的函数之间存在冲突。所以最好重命名你的 strcat 函数。

于 2013-01-04T06:34:11.750 回答
1

string.h已经提供了一个strcat,所以只需将您的函数重命名为其他名称。

于 2013-01-04T06:18:55.560 回答
1

库中已经strcat定义了一个string.h带有签名的函数char *strcat(char *Destination, char *Source);。您的用户定义函数与之冲突。由于 C 不支持重载,因此您需要重命名函数。

在连接之前,您还必须声明您的目标 char 数组,以便它有足够的空间来保存连接的字符串。如果没有,您将在数组绑定上运行,这可能会导致奇怪的问题。

此外,您的字符串应该以空结尾,因为标准库依赖于它来确定字符串的结束位置。如果没有空终止符,则strlen无法计算字符串长度(除非意外下一个内存位置恰好有一个 NULL 字符 - 您永远不应该依赖此类意外)。

于 2013-01-04T06:19:21.233 回答
1

您的函数不能具有该名称,因为它是在 string.h 中声明的。只需将您的函数重命名为 myStrcat 或类似的名称。

于 2013-01-04T06:20:04.817 回答
1

替换strcatstr_cat, 因为您的函数名称与已存在的函数冲突string.h

#include<stdio.h>
#include<string.h>

void main() {
  // string concatenation
  char str1[] = {'S', 'h'};
  char str2[] = {'X', 'y'};
  str_cat(str1, str2);
}

void str_cat(char str1[], char str2[]) {
  int index;
  int str1_length = strlen(str1);
  for(index=0; index<strlen(str2); index++) {
    str1[index + str1_length] = str2[index];
  }
}
于 2013-01-04T06:20:17.237 回答
0

只需更改您的代码如下:

 replace char str1[] = {'S', 'h'} by char str1[] = {'S', 'h', '\0'};
 replace char str2[] = {'X', 'y'} by char str2[] = {'X', 'y', '\0'};
于 2013-01-04T07:56:06.803 回答
0
#include<stdio.h>
#include<string.h>

void mystrcat(char str1[], char str2[]);

void main() {
char str1[] = {'S', 'h' , '\0'};
char str2[] = {'X', 'y', '\0'};
mystrcat(str1, str2);
}

// string concatenation
void mystrcat(char str1[], char str2[]) {
int index;
int str1_length = strlen(str1);
for(index=0; index<strlen(str2); index++) {
    str1[index + str1_length] = str2[index];
}
str1[index + str1_length] = '\0';
printf("%s\n",str1);
}
于 2013-01-04T09:05:42.407 回答