1

我试图strcat自己实现,它似乎有效,但我不明白它到底是怎么来 p'\0'?它没有从 b 复制它,并且不放它就不应该在那里。有什么解释吗?输出是“yesMichaelJudy”。

#include<string.h>
#include<stdio.h>
#include <stdlib.h> 
#include<conio.h>


char* strcat1( char *s1, const char *s2 )
{
    register char  *p = s1;

    while ( *p )
          ++p;

    while (*s2){

        *p=*s2;
        ++p;
        ++s2;

    }

    if (*p=='\0') printf("yes");
    ++p;
    p='\0';

    return s1;
}


int main(){

    char* a;
    char* b;

    char* result;
    result=(char *)calloc(20,sizeof(char));
    a=(char *) calloc(20,sizeof(char));
    b=(char *) calloc(20,sizeof(char));
     strcpy (a,"Michael");
    strcpy (b,"Judy");
    result=strcat1(a,b);

    printf(result);

    getch();
    return 1;

}
4

6 回答 6

4

您分配的空间大于所需的空间,并且您正在使用 calloc() 根据定义将所有字符清除为零;因此末尾的额外字符为零。

于 2013-06-04T23:18:18.357 回答
2

strcpy复制字符串末尾的 NUL 字符。即使没有,您也可以calloc用来分配aand b,并calloc分配和归零内存。由于您分配的空间多于使用的空间(分配 20 个字节,使用 4 个 forJudy和 7 个 for Michael),因此无论如何在字符串之后都有一些零字节。

于 2013-06-04T23:16:42.750 回答
1
p='\0';

That's nonsense. It does nothing useful. It will also generate at least a compiler warning if not an error. The code should be

*p='\0';

Which is what puts \0 at the end of the string.

于 2013-06-04T23:30:12.767 回答
0

p在你的strcat1点到通过参数传递的数组中s1。并且参数s1对应于 中的a参数main。main中数组的内容由a填充数据strcpy (a,"Michael")。这就是将其'\0'放在该数据末尾的原因。strcpy做过某事。(你也可以说 that '\0'from "Michael"since"Michael"也有 a'\0'结尾,即使它没有明确指定)。

于 2013-06-04T23:59:14.977 回答
0

calloc 零初始化(即用 NUL 或 '\0' 填充它)分配的缓冲区。

于 2013-06-04T23:16:11.157 回答
0

strcpy() 以空值终止字符串。但即使没有, calloc() 也会把它放在那里。calloc() 将分配的内存清零。一旦分配了内存, a 和 b 就只是一堆字符串终止符。

于 2013-06-04T23:17:55.313 回答