Chinaunix

标题: 大家通常是如何清空 scanf()后 留下的回车符( 后面有getchar()语句 [打印本页]

作者: skysky1752    时间: 2013-07-17 19:19
标题: 大家通常是如何清空 scanf()后 留下的回车符( 后面有getchar()语句
本帖最后由 skysky1752 于 2013-07-17 21:38 编辑

scanf("%d",&i);
ch=getchar();

除了在scanf()后面,ch=getchar()前面,再另外加一个“getchar() ;”语句外(但是这样只能吸收一个回车符,如果回车符前面还有多个字符,该如何清空呢?如果使用循环“while(getchar()!=10);”来清空多个字符,有没有不妥的地方),通常大家是如和清空scanf()后流下的回车符的?
fflush(stdin):   gcc 好像用不了。
scanf("%[^\n]",string); 如何使用?
作者: myworkstation    时间: 2013-07-17 20:14
回复 1# skysky1752


    为什么一定要处理scanf留下的回车符?标准对这个没有明确的说明,所以由编译器实现定义的行为只能由编译器相关的方式去解决。VC支持使用fflush去清空剩余的缓冲,gcc不支持,变通的方法是scanf之后调用getchar(or fgetc(stdin))或者在调用scanf之前使用setbuf或setvbuf自行更换自定义的缓冲区,进而实现对缓冲中回车符的管理。

  1. //你说的格式要这么用,最多在一行上读取9个字符(因为要加NUL字符)
  2. char str[10];
  3. scanf("%10[^\n]",str);

  4. //GCC支持另一个种扩展,由scanf根据指定range向参数指定的指针中申请的内存并赋值。
  5. char* p=NULL;
  6. scanf("%a[range]",&p);
  7. if( p )
  8.    free(p);
复制代码

作者: lin5161678    时间: 2013-07-17 20:29
回复 2# myworkstation

scanf("%10[^\n]",str);
其实
scanf("%*[^\n]");
就不必考虑 9个10个字节了   
作者: lin5161678    时间: 2013-07-17 20:30
scanf(" %c")
空格%c 读取非空白字符
有时候就够了

作者: pmerofc    时间: 2013-07-18 00:07
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2