将空字符复制到字符串时,null仍会被打印为垃圾

时间:2013-02-11 12:47:14

标签: c string pointers null

我正在写这个函数,它将s2中的n个字符复制到s1中。如果s2的长度小于n,则n个字符的其余部分将由空字符组成。

main()
{
    char sourceStr[10];
    char destStr[80];
    int myInt;

    printf("Enter a string: ");
    gets(sourceStr);

    printf("Enter the number of characters: ");
    scanf("%d", &myInt);

    printf("Returned string: %s ", copyastring(destStr, sourceStr, myInt));
    return 0;

}

char *copyastring(char * s1, char * s2, int n)
{

    int a = n;
    for( n ; n > 0 ; n--)
    {
            // if end of s2 is reached, the rest of s1 becomes null
        if(*s2 == '\0')
        {
            while(n > 0)
            {
                *s1 = '\0';
                s1++;
                n--;
            }
            break;
        }
            //if-not, copy current s2 value into s1
            //increment both pointers
        else
        {
            *s1 = *s2;
            s2++;
            s1++;
        }
    }
    // Just incase s2 is longer than n, append a null character
    s1++;
*s1 = '\0';
s1--;

    //Reset s1's pointer back to front of s1
    s1 = s1 - a;
    return s1;
}

运行此代码并打印出函数返回的字符串后,我意识到所有空字符都打印为乱码(不可读)。为什么会这样?不是空字符终止字符串吗?

提前致谢

2 个答案:

答案 0 :(得分:1)

如果s2长于n个字符,则不会将终结符添加到字符串s1,因此将返回的指针作为字符串打印将产生垃圾。

答案 1 :(得分:0)

调用copyastring,其中myInt < strlen(sourceStr)将无法添加空终结符tp destStr。然后,您将打印destStr的其余部分中显示的任何数据以及其后的堆栈,仅在程序崩溃或遇到零字节时终止。

一个简单的解决方法是始终在copyastring

的末尾添加一个空终结符
s1 = s1 - a;
s1[n-1] = '\0';
return s1;