scanf("%*[^\n]%*c")是用扫描集将缓冲区中的字符全部读取来实现清除缓冲区的动作。%*〔^\n〕将逐个读取缓冲区中的'\n'字符之前的其它字符,%后面的*表示将读取的这些字符丢弃,前遇到'\n'字符时便停止读取操作,此时,缓冲区中尚有一个'\n'字符遗留,所以后面的%*c将读取并丢弃这个遗留...
#include<stdio.h>intmain(){// 设置缓冲模式为行缓冲,缓冲区大小为10字节setvbuf(stdout,NULL, _IOLBF,10);fprintf(stdout,"1234567");// 这里先向stdout对应的缓冲区中写入了7字节fflush(stdout);// 刷新缓冲区,将缓冲区中的数据写入到标准输出流中getchar();// 这里等待用户输入printf("89");// 再向...
2.清空输入缓冲区的方法 虽然不可以用fflush(stdin),但是我们可以自己写代码来清空输入缓冲区。只需要在scanf函数后面加上几句简单的代码就可以了。 /* C版本*/ #include <stdio.h> int main( void ) { int i, c; for ( ; ; ) { fputs("Please input an integer: ", stdout); scanf("%d", &i...
但是一旦用户输入的不是整数(如小数或者字母),假设 scanf 函数最后一次得到的整数是 2 ,那么程序会不停地输出“Please input an integer: 2”。这是因为 scanf("%d", &i); 只能接受整数,如果用户输入了字母,则这个字母会遗留在“输入缓冲区”中。因为缓冲中有数据,故而 scanf 函数不会等待...
利用fflush方法清空缓冲区(不是所有平台都能使用) 格式: fflush(stdin); C和C++的标准里从来没有定义过 fflush(stdin) MSDN 文档里清除的描述着"fflush on input stream is an extension to the C standard" (fflush 是在标准上扩充的函数, 不是标准函数, 所以不是所有平台都支持) 利用setbuf方法清空缓冲区(...
那么这个回车就会残留在缓存中,而当你的scanf读取flag的时候,程序会自动获取前面的那个回车符号,这就是用%c会自动跳过的原因,而用%s的话,程序就会等待下一行输入,回车符号并不会被接收,建议在scanf("%c", &flag);修改为:fflush(stdin); //清空缓存 scanf("%c", &flag);...
scanf("%d",&shang);//循环死啦...怎么退出去啊...改为 fflush(stdin);/*清空输入缓冲区,以避免之前的输入影响后面的读取*/
这是因为 scanf("%d", &i); 只能接受整数,如果用户输入了字母,则这个字母会遗留在“输入缓冲区”中。因为缓冲中有数据,故而 scanf 函数不会等待用户输入,直接就去缓冲中读取,可是缓冲中的却是字母,这个字母再次被遗留在缓冲中,如此反复,从而导致不停地输出“Please input an integer: 2”。也许...
第一个scanf("%ld",&p->num) 输入了一个数值后必然要按下回车,此时,这个scanf()是不接收回车的,因此你紧接着使用的scanf("%c",&p->sex)就把回车接收了,办法的在第一个scanf("%ld",p->num)后面用一个fflush(stdin)语句清空输入流。
defail); } int myOcNum; do { scanf("%d", &myOcNum); } while (myOcNum<1 && myOcNum>myOcLen); //必须在职业范围内 fflush(stdin); //清除输入的缓冲区 plays[count].occupation = myOc[myOcNum - 1]; //职业 //选择两个职业技能 printf("\n请选择两个职业技能:\n\n"); int ...