while循环中使用scanf函数
Posted VIPler
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了while循环中使用scanf函数相关的知识,希望对你有一定的参考价值。
妈的,这scanf函数学了快10年了,怎么还会出现莫名其妙的问题?看下面的代码(VS2012环境下运行):
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { char root_value = ‘\0‘; int i =1; while (i!=5) { printf("输入:"); scanf("%c",&root_value);//用户输入节点 i++; } printf("输入:%c\n",root_value); }
本意是每次循环读取一个字符,结果在VS2012里面运行,运行结果莫名其妙:第一次循环输入字符a,然后回车,进行下一次输入,结果屏幕直接输出两个“输入:输入:“。原来scanf把回车也当作一个字符读入了。
原因是因为scanf()函数会把回车、空格、Tab或一些非法输入的字符当作此次输入的结束标志,它不会把这些字符输入到想要保存此次输入数据的变量中,而是把这些字符遗留在了输入缓冲区,那么,当下一次想要从标准输入中读取一个字符时,这个遗留的字符就正好充当了此次的输入字符。
显而易见,程序在输入abcdefg之后,输入了回车来结束此次输入,那么回车就遗留在了输入缓冲区,当需要给c输入字符时,它自动的充当了输入的字符,因此,程序没有给我们输入c的字符的机会。(通过输出abcdefg之后又两个空行(残留在输入缓冲区和输出的两个回车导致的)也可以验证)
C语言为了解决这种问题,为我们提供了一种很方便的清空输入缓冲区的方式—->>fflush()函数,它会把残留在输入缓冲区里的所有数据清空
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { char root_value = ‘\0‘; int i =1; while (i!=5) { printf("输入:"); scanf("%c",&root_value);//用户输入节点 fflush(stdin); i++; } printf("输入:%c\n",root_value); }
以上是关于while循环中使用scanf函数的主要内容,如果未能解决你的问题,请参考以下文章
C : while( scanf("%d",&num) != 1 ) 无限循环