Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';这个基本的strcat实现有什么问题?_C - Fatal编程技术网

什么';这个基本的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'};

我是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];
  }
}
#包括
#包括
void main(){
//字符串串联
字符str1[]={'S',h'};
字符str2[]={'X','y'};
strcat(str1、str2);
}
无效strcat(字符str1[],字符str2[]{
整数指数;
int str1_length=strlen(str1);

for(index=0;index
string.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 remove
string.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);
}