初学者C,为什么在我的字符串中添加了一堆随机的东西?

时间:2017-07-01 12:06:47

标签: c string

我有以下程序,我想以我的名义(Sahand)逐个字符地阅读并以字符串形式存储:

#include <stdio.h>


int main(int argc, const char * argv[]) {

    char temp;
    char str[6];
    int i;
    for ( i = 0 ; i < 6 ; i++ )
    {
        scanf(" %c",&temp);
        printf("Our temp is: %c\n",temp);
        str[i] = temp;
        printf("Our total string is: %s\n",str);
    }
    printf("Program ended with the string: %s\n",str);

    return 0;

}

输出是这样的:

s
Our temp is: s
Our total string is: s
a
Our temp is: a
Our total string is: sa
h
Our temp is: h
Our total string is: sah
a
Our temp is: a
Our total string is: saha
n
Our temp is: n
Our total string is: sahan
d
Our temp is: d
Our total string is: sahandd\350\367\277_\377
Program ended with the string: sahandd\350\367\277_\377
Program ended with exit code: 0

正如你所看到的,一切都很顺利,直到最后一个字母d进入,当另一个d和一堆随机的东西被添加到字符串上时。有人可以向我解释这里发生了什么吗?

3 个答案:

答案 0 :(得分:6)

您应该在打印前将空字符添加到字符串中。由于您在循环内打印,请将其添加到下一个字符。绝对要确保for循环不会超出数组的范围。

#include <stdio.h>


int main(int argc, const char * argv[]) {

char temp;
char str[7];
int i;
for ( i = 0 ; i < 6 ; i++ )
{
    scanf(" %c",&temp);
    printf("Our temp is: %c\n",temp);
    str[i] = temp;
    str[i+1] = '\0';
    printf("Our total string is: %s\n",str);
}

printf("Program ended with the string: %s\n",str);

return 0;

}

另一种选择是将C-String中的每个字符实际初始化为&#39; \ 0&#39;角色(没有覆盖最后一个);正如其他人在评论中提到的那样,这可以在数组的声明中完成:

char str[7] = { 0 };

答案 1 :(得分:0)

您需要空字符('\0')来结束5th索引处的字符串(数组),以告诉编译器这是字符串的结尾(在您的情况下是字符数组,即, str)。但是您使用5th索引来存储字符'd'。 编译器从garbage value

获取memory

为了正确运行程序,您需要声明str数组,如下所示:

char str[7];

'\0'位置插入空字符((i+1)th)。看下面:

#include <stdio.h>


int main(int argc, const char * argv[]) {

    char temp;
    char str[7];
    int i;
    for ( i = 0 ; i < 6 ; i++ )
    {
        scanf(" %c",&temp);
        printf("Our temp is: %c\n",temp);
        str[i] = temp;
        str[i+1] = '\0';
        printf("Our total string is: %s\n",str);
    }
    printf("Program ended with the string: %s\n",str);

    return 0;

}

答案 2 :(得分:-2)

阅读完评论后,我在程序中更改了以下行:

char str[6];

char str[7];

这就是诀窍,程序按照我的意愿执行。

编辑:

除了更改此行之外,我在变量声明后添加了str[6] = 0;