2013-01-04 47 views
0

我对C相当陌生,我试图编写一个简单的程序来连接两个字符串。虽然在我的Linux机器上运行它,我得到以下异常:这个基本的strcat实现有什么问题?

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]; 
    } 
} 
+0

只是删除'string.h',还有另外一个'strcat'实施存在于'string.h' –

+0

@AdeelAhmed他需要的strlen – 2013-01-04 06:22:47

+0

然后更换'其他一些相似的名字strcat' string.h中 –

回答

1

string.h已经提供了strcat所以只重命名功能到别的东西。

1

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

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

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

5

strcat没有standard signature

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

你需要做,如果你想包括string.h与之相匹配。或者,只要给你的实现一个不同的名称(例如my_strcat)。

你可能也会想要终止你的测试字符串 - 那些strlen调用会给你非常有趣的结果,否则。另外,为避免写入超过第一个字符串的分配内存的末尾(从而导致未定义的行为),请确保给它足够的空间以适合第二个字符串的末尾。

1

您的函数不能在string.h中声明该名称。只需将你的函数重命名为myStrcat或者其他类型的东西。

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]; 
    } 
} 
+0

实际上,以'str'开头的函数名称后跟一个小写字母的名称空间是保留的,所以不要这样做。 – unwind

2

,也没有适当的字符串。

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

你让你的字符串是这样的:

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

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

要使字符串可用于诸如strlen之类的函数,它必须具有空终止符。
我建议:

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

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

0

只要改变你的代码如下:

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

有在你的代码中的许多错误。首先,字符串str1和str2应该以null结尾。你可以通过改变它们的声明更正,以

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

其次,strcat是保留名称,所以你的主要功能不打电话给你的版本,但是这是版本发现在头文件<string.h>。您可以通过重命名您的功能或通过不包含标头string.h来更正此问题。如果你做第二个,你也应该实现功能strlen,因为它在string.h找到。

+0

感谢您的评论。后续问题:如果我将字符串写为: char str1 [] =“Sh”; C编译器是否自动添加'\ 0'字符来终止它? –

+0

“所以你的主要功能不会调用你的版本”......这个*可以是真实的,但不适用于大多数已知的实现。 “在头文件上找到的版本” - string.h中没有strcat的版本,只是一个声明。 –

+0

@ user721998是的,这就是为什么推荐你使用它而不是char str [] = {...},这有时会引起误解。 –

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