寻找垃圾价值的来源

时间:2016-09-26 16:56:48

标签: c garbage

所以我做了一个自定义代码来删除字符串中的空格。但是当我运行它时,如果没有输入,第二个字符串将给出3个垃圾值,如果有太多空格,代码有时会自己添加一个空格字符串。我只是找不到三个垃圾值的来源:(

#define SIZE 200
int main ()
{
    int w=0, z=0, x=0, y=0, z0, rDlength=0, Dlength=0, RandomChar, Dx=0, Dy=0;
    char rstring[SIZE], string[SIZE];
    srand(time(NULL));

    //debug
    int space=0;

    printf("Input Text: ");
    gets(rstring);
    strupr(rstring);
    strlen(rstring);
    rDlength=strlen(rstring);

    //debug
    printf("%d\n", rDlength);

    w=-1; 
    for(z=0;z<=rDlength;z++)
    {    if(rstring[z]==' ')
         {   space++;
             continue;
         }
         else if(rstring[z]=='\0')
             break;
         else if(rstring[z]!=' ')
             string[++w]=rstring[z];
    }

    //debug
    printf("%d\n", space);

    Dlength=strlen(string);

    for(z=0;z<rDlength;z++)
        printf("%c", rstring[z]);
    printf("\n");

    for(z=0;z<Dlength;z++)
        printf("%c", string[z]);
    printf("\n");

    printf("String length is %d\n", Dlength);
    return 0;
}

如果至少有3个输入字符,则垃圾值似乎消失。但如果只有两个或一个字符,则会出现垃圾值。

1 个答案:

答案 0 :(得分:2)

string添加字符时,不会添加终止空字符。所以string过去的任何元素都是未初始化的。然后,调用strlen会读取那些未初始化的字符,从而生成undefined behavior

复制字符后,将空终止符添加到结尾:

for(z=0;z<=rDlength;z++) {
    if(rstring[z]==' ') {
        space++;
        continue;
    }
    else if(rstring[z]=='\0')
        break;
    else if(rstring[z]!=' ')
        string[++w]=rstring[z];
}
string[++w]='\0';