问题来源
担任了c语言助教,有同学对scanf提出了一些问题,我简化了同学的代码,如下
int main(int argc, char const *argv[]) {
int n, a, b, c;
float f;
scanf("%d\n", &n);
printf("got n: %d\n", n);
scanf("%f\n", &f);
printf("got f: %f\n", f);
scanf("%d%d%d\n", &a, &b, &c);
printf("got abc: %d, %d, %d\n", a, b, c);
return 0;
}
运行情况
❯ g++ -g -o play play.cpp && ./play
385
1
got n: 385
12.5
got f: 1.000000
got abc: 12, 21870, 934916944
问题
在读入n时,输入385,回车,没有读入,而是在后面输入了1,回车才将385读入到了n;
在读入f时,想要读入12.5,但是读到的是上面的1
最后程序结束了,12读到了a中,b和c输出是奇怪的数
原因
"\n"(或是任何空白字符)会跳过所有空白字符,直到输入结束(如"CTRL+D"关闭stdin等)或是遇到非空白字符;"%d"在遇到小数点无法读入,小数点仍保留在缓冲区中。
所以对于上面的程序,用户输入1时,第一个scanf才结束,385被读入了n中
用户输入12.5时,第二个scanf才结束,1被读入了f中
此时输入缓冲区还剩12.5,"%d%d%d\n"首先要求输入一个整数,12被读入到a中了,再要一个整数,遇到小数点,不是整数,b的值不变,小数点及后面的内容保留在缓冲区中,下一个仍要求整数,同样无法读入,最后"\n"遇到了非空字符'.',这个scanf结束
于是输出abc时,a是12,b和c是局部变量,没有初始化,存放的垃圾数据。
网友评论