为什么打印垃圾值?

时间:2019-02-07 01:16:54

标签: c

我的代码是...

#include <stdio.h>
int main(){
    char name[20];
    int age;
    char department;
    double key;
    int i=0;
    while( (scanf("%c", &name[i])) == 1 ){
        i++;
    }
    name[i] = '\0';

    scanf("%d", &age);
    scanf("%c",&department);
    scanf("%lf",&key);


    puts(name);
    printf ("%d\n",age);
    printf("%c\n",department);
    printf("%g",key);

    return 0;
}

,输入值为

mark
20
A
3.154

结果输出应与输入相同

mark
20
A
3.154

但是我得到的是...

mark
20
A
3.154

32766
�

我想知道

32766
�

来自...

2 个答案:

答案 0 :(得分:1)

代码

while( (scanf("%c", &name[i])) == 1 ){
    i++;
}

将读取所有可以读取的 个字符,而不会在mark的结尾处停止

因此,该循环将全部四行读入name,然后scan调用 following 失败,因为没有更多输入,这意味着agedepartmentkey的值保留为创建时所具有的任意值。

换句话说,您的输出可以这样解释:

mark  \
20     \
A       >-- name
3.154  /
      /
32766    -- age (and probably nul for department)
�       -- key

如果要进行基于行的输入,this answer提供了方便的功能,包括缓冲区溢出保护等。对于字符串,只需按输入的方式使用它们,而非字符串可以使用缓冲区上的sscanf进行转换。

答案 1 :(得分:0)

您的第一个带有while (scanf("%c", &name[i]) == 1)的循环应该读取所​​有标准输入,很可能溢出name数组。之后的scanf()调用应该失败-您应该检查每个调用的返回值。之所以重新输入,是因为您首先打印了name;其余的则来自未初始化(或覆盖)的变量。如果您使用printf("[[%s]]\n", name);而不是puts(name);可能会更容易-您会在所有输入内容的周围看到方括号。

您可以通过添加以下内容对其进行修复:

if (name[i] == '\n')
    break;

在最初的while循环内。