寻找垃圾价值的来源

Finding source of garbage value

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

#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]=='[=10=]')
             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个字符,那么垃圾值似乎就消失了。但如果只有两个或一个字符,则会出现垃圾值。

当您向 string 添加字符时,您并未添加终止空字符。因此 string 过去的所有未初始化元素。调用 strlen 然后读取那些未初始化的字符导致 undefined behavior.

复制字符后,在末尾添加空终止符:

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