首页 > 解决方案 > 为什么要打印垃圾值?

问题描述

我的代码是...

#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
�

来自...

标签: c

解决方案


编码

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

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

因此,整个四行都被该循环读取到 中name,然后由于没有更多输入而导致后面scan的调用失败,这意味着,和值被保留为它们在创建时具有的任意值。agedepartmentkey

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

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

如果你想做基于行的输入,这个答案提供了一个方便的功能,有缓冲区溢出保护等等。对于字符串,您只需按输入使用它们,而非字符串可以sscanf在缓冲区上使用转换。


推荐阅读