自我实现strcat显示多个字符串

时间:2015-03-01 15:17:46

标签: c linux

我实现了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));   
}  

3 个答案:

答案 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;字符串,它们都打印出来。这是预期的行为。

相关问题