我的代码是...
#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
�
来自...
答案 0 :(得分:1)
代码
while( (scanf("%c", &name[i])) == 1 ){
i++;
}
将读取所有可以读取的 个字符,而不会在mark
的结尾处停止 。
因此,该循环将全部四行读入name
,然后scan
调用 following 失败,因为没有更多输入,这意味着age
,department
和key
的值保留为创建时所具有的任意值。
换句话说,您的输出可以这样解释:
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循环内。