41

问答题 41 /53

阅读以下代码,找出代码的错误,简要说一下理由。
(1)void test1()
{
    char string[10];
    char *str1 = "0123456789";
    strcpy(string, str1);
}

(2)void test2()
{
    char string[10], str1[10];
    for (int I = 0; I < 10; I++)
    {
        str1[I] = 'a';
    }
    strcpy(string, str1);
}

(3)void test3(char *str1)
{
    char string[10];
    if (strlen(str1) <= 10)
    {
        strcpy(string, str1);
    }
}

参考答案

(1)表面上并且编译都不会错误。但如果string数组原意表示的是字符串的话,那这个赋值就没有达到意图。最好定义为char string[11],这样最后一个元素可以存储字符串结尾符'\0';
(2)strcpy使用错误,strcpy只有遇到字符串末尾的'\0'才会结束,而str1并没有结尾标志,导致strcpy函数越界访问,不妨让str1[9]='\0',这样就正常了。
(3)这又会出现第一道改错题的错误了。strlen(str1)算出来的值是不包含结尾符'\0'的,如果str1刚好为10个字符+1结尾符,string就得不到结尾符了。可将strlen(str1)<=10改为strlen(str1)<10。