这个基本的strcat实现有什么问题?

时间:2013-01-04 06:16:53

标签: c

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

test.c:12:10:错误:'strcat'的冲突类型

请你帮我理解我在这里缺少的东西:

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

10 个答案:

答案 0 :(得分:5)

您的strcat没有standard signature

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

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

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

答案 1 :(得分:2)

除了其他人对名称冲突所说的话,你也没有正确的字符串。

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

你已经按照这种方式制作了字符串:

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

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

要使字符串可以被strlen等函数使用,它必须具有空终止符 我建议:

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

您的代码中存在许多错误。首先,字符串str1和str2应为空终止。您可以通过将其声明更改为

来更正此问题
char str1[] = "Sh";
char str2[] = "Xy";

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

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

答案 4 :(得分:1)

string.h已提供strcat,因此只需将您的功能重命名为其他内容。

答案 5 :(得分:1)

string.h库中已定义strcat函数,签名为char *strcat(char *Destination, char *Source);。您的用户定义函数与它冲突。由于C不支持重载,您需要重命名函数。

在连接之前,还必须声明目标字符数组,以便它有足够的空间来容纳连接字符串。如果没有,你将遍历数组绑定,这可能会导致奇怪的问题。

此外,您的字符串应该以null结尾,因为标准库依赖于它来确定字符串结束的位置。如果没有null终止符,strlen无法计算字符串长度(除非偶然下一个内存位置碰巧有一个NULL字符 - 你不应该依赖这样的事故)。

答案 6 :(得分:1)

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

答案 7 :(得分:1)

strcat替换为str_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];
  }
}

答案 8 :(得分:0)

只需更改您的代码,如下所示:

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

答案 9 :(得分: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);
}