美文网首页
关于scanf中对"\n"的处理以及"%d"遇到小数点的问题

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

作者: devilisdevil | 来源:发表于2020-10-01 09:27 被阅读0次

问题来源

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

参考

相关文章

网友评论

      本文标题:关于scanf中对"\n"的处理以及"%d"遇到小数点的问题

      本文链接:https://www.haomeiwen.com/subject/ywrmuktx.html