ubuntu11.10 设置环境变量
时间:2008-07-05
来源:互联网
int main()
{
int a, b;
printf("enter:");
int n = scanf("%d %d", &a, &b);
if(n<2)
{
printf("err--n:%d\n", n);
printf("enter:");
//fflush(stdin);
scanf("%d %d", &a, &b);
}
return 0;
}
执行情况:
enter:1 2
[zongzw@localhost stdin]$ a.out
enter:[b]1,[/b]
err--n:1
enter:[zongzw@localhost stdin]$
作者: zongzw 发布时间: 2008-07-05
作者: BigSnake.NET 发布时间: 2008-07-05
那怎么才能不吃掉呢。
作者: zongzw 发布时间: 2008-07-05
*参见这篇文章,http://blog.csdn.net/fxwzzbd/archive/2008/06/05/2514042.aspx
键盘输入缓冲区与scanf()原理。
键盘缓冲区用来缓存“按键”的ASCII码,而scanf()每次从键盘缓冲区中读取一个字符(ASCII码),直键盘缓冲区为空。如果键盘缓冲区为非空状态,执行scanf()不会要求输入,如果键盘缓冲区为空,执行scanf()则会等待用户的输入。
有时候我们可以在想要的输入之后添加一个scanf("%s", ch);来把标准输入中没有正确读入的信息读掉,清空标准输入。
#include <string.h>
int main()
{
int a, b;
int enough_len = 256;
char ch[enough_len];
memset(ch, 0, enough_len);
printf("enter:");
int n = scanf("%d %d", &a, &b);
if(n<2)
{
scanf("%s", ch);
printf("err--n:%d\n", n);
printf("enter:");
//fflush(stdin);
scanf("%d %d", &a, &b);
}
return 0;
}
作者: zongzw 发布时间: 2008-07-05
*参见这篇文章,http://blog.csdn.net/fxwzzbd/archive/2008/06/05/2514042.aspx
键盘输入缓冲区与scanf()原理。
键盘缓冲区用来缓存“按键”的ASCII码,而scanf()每次从键盘缓冲区中读取一个字符(ASCII码),直键盘缓冲区为空。如果键盘缓冲区为非空状态,执行scanf()不会要求输入,如果键盘缓冲区为空,执行scanf()则会等待用户的输入。
有时候我们可以在想要的输入之后添加一个scanf("%s", ch);来把标准输入中没有正确读入的信息读掉,清空标准输入。
#include <string.h>
int main()
{
int a, b;
int enough_len = 256;
char ch[enough_len];
memset(ch, 0, enough_len);
printf("enter:");
int n = scanf("%d %d", &a, &b);
if(n<2)
{
scanf("%s", ch);
printf("err--n:%d\n", n);
printf("enter:");
//fflush(stdin);
scanf("%d %d", &a, &b);
}
return 0;
}
我一看到这个,这是我的第一反应。
C和C++的标准里从来没有定义过 fflush(stdin)。也许有人会说:“可是我用 fflush(stdin) 解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(gcc3.2不支持),因为标准中根本没有定义 fflush(stdin)。MSDN 文档里也清楚地写着 fflush on input stream is an extension to the C standard (fflush 操作输入流是对C标准的扩充)。当然,如果你毫不在乎程序的移植性,用 fflush(stdin) 也没什么大问题。以下是 C99 对 fflush 函数的定义:
int fflush(FILE *stream);

作者: kofshower 发布时间: 2008-07-06
说的很对,我在vc下实验fflush可以但是gcc下就不行了,我用的是gcc4.1,也是不支持fflush的。
于是、然后,scanf("%s",ch)掉多余的没有正确读入的字符就可以了。
作者: zongzw 发布时间: 2008-07-06
http://hi.baidu.com/flyinflash/blog/ite ... 55915.html
我不明白,你为什么会这样写,scanf 的返回值一般没有什么意义
概述:
不管是 scanf 还是 getchar,它们都不会接收 enter,
比如使用 scanf 接收输入
abc<-enter
则输入流为
abc\10(\10为回车)
但是scanf 仅认abc,\10会被下一个接收输入函数接收,所以会出现“跳过”的怪异情况
使用 getchar 接收输入
a<-enter
则输入流为
a\10
getchar 跟 scanf 一个样,不理 \10 的
int main()
{
int a, b;
a = getchar();
b = getchar();
printf("\n a = %d :: %c ", a, a);
printf("\n b = %d :: %c ", b, b);
return 0;
}
作者: flyinflash 发布时间: 2008-07-06
我需要一次读入几个数据而不是1个数据啊,读入几个数据,并每次都敲一下回车,当然可以,我要得可不是这个效果。。,所以我会那样写:("%d %d", &a, &b)
作者: zongzw 发布时间: 2008-07-06
1、使用一个较长数组接收输入,把要的保留,不要的 \10 去掉。
但是,如果不知道哪些要,哪些不要,这个就不可行,与及,“较长“到底要多长?
2、自定义一个函数
我的博客里面没有写完 :D:D
http://hi.baidu.com/flyinflash/blog/ite ... 55915.html
作者: flyinflash 发布时间: 2008-07-06
作者: zongzw 发布时间: 2008-07-06
思想和我的第一个解决方案有异曲同工之妙
fflush - flush a stream
SYNOPSIS
#include <stdio.h>
...
CONFORMING TO
C89, C99.
NOTES
Note that fflush() only flushes the user space buffers provided by the
C library. To ensure that the data is physically stored on disk the
kernel buffers must be flushed too, for example, with sync(2) or
fsync(2).
fflush 定义在 stdio 头文件里面,它是标准库的函数
但是,GCC 下工作得不是很好
作者: flyinflash 发布时间: 2008-07-06
一个小游戏
http://forum.ubuntu.org.cn/viewtopic.ph ... sc&start=0
里面就是使用第一种方案解决的,您看一下吧,说不定您能想到更的办法:D:D:D
作者: flyinflash 发布时间: 2008-07-06
以c为例:这个惯用法同样适合stdin被重定向到文件的时候
附件: |
![]() window.png [ 73.83 KiB | 被浏览 508 次 ] |
作者: kofshower 发布时间: 2008-07-06
给我拖出去打~~~
void flush()
{
int c;
while ((c = getchar() != '\n') && c != EOF) ;
}
int main(int argc, char** argv)
{
int i, j;
i = getchar();
flush();
j = getchar();
putchar(i);
putchar(j);
return 0;
}
我建议把 flush 写进自定义的头文件里面
sudo chown lee:lee /usr/include/lee
touch /usr/include/lee/stdiol.h
#define __STDIOL_H__
#include <stdio.h>
#include <stdlib.h>
int getch(void)
{
int key;
system("stty raw");
// stty - change and print terminal line settings
// raw - same as -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr
key = getchar();
system("stty cooked");
// cooked - same as brkint ignpar istrip icrnl ixon opost isig icanon,
// eof and eol characters to their default values
return key;
}
void flush()
{
int c;
while ((c = getchar() != '\n') && c != EOF) ;
}
#endif
作者: flyinflash 发布时间: 2008-07-06
#include <lee/stdiol.h>
int main(int argc, char** argv)
{
int i, j;
i = getchar();
flush();
j = getchar();
printf("\n");
putchar(i);
putchar(j);
printf("\n");
return 0;
}
128391
salkdflasf
1s
lee@lee-thinkpad:/tmp$
作者: flyinflash 发布时间: 2008-07-06
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28