我实现了strcat函数,当我只是玩游戏时我使用了我的函数并开始与标准的字符串函数strcat进行比较,但我发现了一个关于my_strcat和strcat输出的问题。在my_strcat中,“编程”打印两次,而在strcat中它只打印一次,这是预期的行为,但是在my_strcat的情况下,为什么“编程显示两次”。
我尝试过的事情:在while循环之后,我把* dest ++ ='\ 0'放进去,然后“编程”会显示两次。我正在使用linux系统进行编程和gcc。
o/p:
strcat:Pl_z� programming
my_strcat:Pl_z� programming programming
char *my_strcat(char *dest, const char *src) {
char *dst = dest;
while(*dest!= '\0')
dest++;
while(*dest++ = *src++)
;
return dst;
}
int main(int argc, char **argv) {
// char string1[25] = "C";
char string1[25];
char string2[] = " programming " ;
printf(" strcat:%s\n",strcat(string1, string2));
printf(" my_strcat:%s\n",my_strcat(string1, string2));
}
答案 0 :(得分:3)
问题不在于strcat
的实施。您忘记在通话之间清除string1
,因此my_strcat
(正确)会附加到它!
如果您想“清除”它(为了strcat
的目的),您只需将第一个字符设置为'\0'
:
string1[0] = '\0';
感谢iharob帮助我恢复了巨大的脑力。
发生这种情况的原因(比如说,这是预期的行为)是strcat
的目的是在另一个的末尾附加一个字符串。引用手册页:
strcat()函数将src字符串附加到dest字符串,覆盖dest末尾的终止空字节('\ 0'),然后添加一个终止空字节。
正如Ôrel在下面指出的那样,程序的行为是未定义的,因为在使用它之前没有初始化string1
。有关详细信息,请参阅this question的答案。
答案 1 :(得分:2)
正如其他人提到的那样,虽然程序的行为未定义,但您的程序运行正常,因为您没有初始化string1
数组,所以
while (*dest++ != '\0')
将永远不会找到'\0'
或者它将会发现,您无法确定,因此您需要将它的第一个元素设置为'\0'
,以使您的代码正常工作。
您的my_strcat()
实现是正确的,但为了使您的测试工作,您需要重置目标字符串,而不是将字符串连接两次,因此观察它打印两次,所以这应该按预期工作< / p>
#include <string.h>
#include <stdio.h>
char *my_strcat(char *dest, const char *src) {
char *dst = dest;
while (*dest!= '\0')
dest++;
while ((*dest++ = *src++) != '\0') {}
return dst;
}
int main(int argc, char **argv) {
// char string1[25] = "C";
char string1[25];
char string2[] = " programming " ;
string1[0] = '\0';
printf("strcat : %s\n", strcat(string1, string2));
string1[0] = '\0';
printf("my_strcat: %s\n", my_strcat(string1, string2));
}
答案 2 :(得分:1)
你附加&#34;编程&#34;一次使用strcat()
,另一次使用my_strcat()
。总共有两个附加&#34;编程&#34;字符串,它们都打印出来。这是预期的行为。