scanf中的\n问题

scanf中的\n问题

C程序执行scanf时,会从缓冲区读数据,如果缓冲区是空的,就阻塞住,等待你从键盘输入。输入结束后按回车会执行scanf函数,程序会逐个读取缓冲区的数据,注意,这时会将\n留在缓冲区(缓冲区只剩下\n)。如果后面输入整型即%d,并不会造成影响,因为缓冲区中的\n是字符,并不会被当作%d读入,会被忽略而读取后面的整型数据,而如果后面输入字符型即%c,这时就需要特别注意,因为缓冲区的\n会被当作%c读入,这样就会存在问题。为了解决这一问题,可以用到scanf末尾加\n的方法。

如果给scanf末尾加上\n,\n不表示等待换行符,而是读取并放弃连续的空白字符,你输入结束之后按回车不会结束,无论再输入多少空白字符都会被忽略,要等再接收到一个非空白字符(空格、制表符、回车)的输入后scanf语句才结束。但需要注意的是,最后输入的那个非(空格、制表符、回车)的东西是不会被这个scanf读进来的,而是留在缓冲区中。

所以,务必注意,请小心scanf函数结束时的\n,它会留在缓冲区被下一个getchar()或者scanf("%c",&ch)所读入,但实际上你并不想读入\n。有以下四种方式来解决这个问题:

  1. 用\n过滤scanf结束时的回车。但是注意,最后一个scanf语句不需要\n,因为缓冲区的\n并不会对后续输入造成影响,反而会导致你需要额外输入一个非空白字符作为结束。
  2. 用一个额外的getchar()获取到多余的\n。
  3. 后续的scanf函数中在%c前多加一个空格用来匹配多余的\n。
scanf(" %c"&ch)
  1. 使用fflush(stdin)函数清空缓冲区(慎用,因为有的编译器不支持)。
fflush(stdin);

你可能感兴趣的:(C,c语言)