当前位置:   article > 正文

c语言scanf小数,关于scanf中对"\n"的处理以及"%d"遇到小数点的问题

scanf小数

问题来源

担任了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是局部变量,没有初始化,存放的垃圾数据。

参考

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号