什么';这个基本的strcat实现有什么问题?
我是C语言的新手,我正在尝试编写一个简单的程序来连接两个字符串。在我的Linux设备上运行时,出现以下异常: test.c:12:10:错误:“strcat”的类型冲突 你能帮我理解我在这里遗漏了什么吗:什么';这个基本的strcat实现有什么问题?,c,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'};
#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];
}
}
#包括
#包括
void main(){
//字符串串联
字符str1[]={'S',h'};
字符str2[]={'X','y'};
strcat(str1、str2);
}
无效strcat(字符str1[],字符str2[]{
整数指数;
int str1_length=strlen(str1);
for(index=0;indexstring.h
已经提供了一个strcat
,因此只需将您的函数重命名为其他函数。在string.h
库中已经定义了一个函数,其签名为char*strcat(char*Destination,char*Source)
。用户定义的函数与之冲突。由于C不支持重载,您需要重命名函数
在连接之前,您还必须声明目标字符数组,以便它有足够的空间容纳连接的字符串。如果没有,您将运行数组绑定,这可能会导致奇怪的问题
此外,字符串应该以null结尾,因为标准库依赖于此来确定字符串的结束位置。如果没有null结尾符,strlen
无法计算字符串长度(除非下一个内存位置碰巧有一个null字符,否则决不应依赖此类意外).您的strcat
没有:
如果希望包含string.h
,则需要使其匹配。或者,只需为实现指定一个不同的名称(my_strcat
)
您可能还希望null终止您的测试字符串-否则,那些strlen
调用将为您提供非常有趣的结果。此外,为了避免写入超过第一个字符串分配内存的末尾(从而导致未定义的行为),请确保给它足够的空间以容纳结尾的第二个字符串。您的函数不能有该名称,因为它是在字符串中声明的。h.只需将您的函数重命名为myStrcat或类似的名称。将strcat
替换为stru cat
,因为您的函数名称与已存在的函数冲突t在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];
}
}
#包括
#包括
void main(){
//字符串串联
字符str1[]={'S',h'};
字符str2[]={'X','y'};
str_cat(str1,str2);
}
void str_cat(char str1[],char str2[]{
整数指数;
int str1_length=strlen(str1);
对于(index=0;index,除了其他人所说的名称冲突之外,您也没有合适的字符串
在C语言中,字符串以空终止符(\0
)结尾
您的字符串是这样制作的:
char str1[] = {'S', 'h'};
所以它只有两个字符,S和h
要使字符串可由strlen等函数使用,它必须具有空终止符。
我建议:
char str1[] = {'S', 'h', '\0'};
C语言中有预定义的函数“strcat”(在string.h中),因此当您试图调用strcat时,编译器似乎会在该内置函数和您定义的函数之间产生冲突。因此,最好重命名strcat函数。只需按以下方式更改代码:
replace char str1[] = {'S', 'h'} by char str1[] = {'S', 'h', '\0'};
replace char str2[] = {'X', 'y'} by char str2[] = {'X', 'y', '\0'};
代码中有许多错误。首先,字符串str1和str2应该以null结尾。您可以通过将其声明更改为
char str1[] = "Sh";
char str2[] = "Xy";
或
其次,strcat
是一个保留名称,因此您的主函数不调用您的版本,而是在头文件
中找到的版本。您可以通过重命名函数或不包含头文件字符串.h
来更正此问题。如果执行第二个,您还应该实现该函数>strlen
,因为它位于string.h
\include
#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);
}
#包括
void mystrcat(char str1[],char str2[]);
void main(){
字符str1[]={'S','h','\0'};
char str2[]={'X','y','\0'};
mystrcat(str1、str2);
}
//字符串串联
void mystrcat(char str1[],char str2[]{
整数指数;
int str1_length=strlen(str1);
对于(index=0;indexjust removestring.h
,在string.h
@adelahmed中存在另一个strcat
实现,他需要string.h用于strlenth然后用其他类似名称替换strcat
,除了其他用户注意到的问题外,您还存在性能问题。问题中的实现n的时间复杂度为O(n²)没有什么好的理由。因为你是C新手,我不想破坏发现解决方案的满足感,但也许有一个提示:你能在根本不调用strlen的情况下解决这个问题吗?未定义的行为:str1
和str2
应该被nul终止,以便strlen
工作并通过写入str[2]
(及以上)您正在写入超出数组边界的内容……实际上,以str
开头并后跟小写字母的函数名的命名空间是保留的,因此不要这样做。感谢您的评论。后续问题:如果我将字符串写为:char str1[]=“Sh”;C编译器是否会自动添加“\0”字符以终止它?“因此您的主函数不会调用您的版本”…这可能是真的,但对于大多数已知的实现来说并非如此。“在头文件中找到的版本”--string.h中没有strcat的版本,只是一个声明。@user721998是的,这就是为什么建议您使用它而不是char str[]={…},这有时会产生误导。
char str1[] = {'S', 'h', '\0'};
char str2[] = {'X', 'y', '\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);
}