首页 > 新闻

论坛总结2

时间:2009-04-20 09:39:38  作者:爱在西元前  我要投稿
Linux初探欢迎您的投稿,投放方法请点击这里查看,我们会定期赠送精美小礼品给优秀的投稿作者。海纳百川 取则行远!LinuxGoo欢迎您的到来。
1for (int i=0; i <10; i ) { printf("%d\n",i); scanf("%c",......

1

for (int i=0; i <10; i )

{

printf("%d\n",i);

scanf("%c",&a);

}

想控制输入10个字符,为什么循环两次才运行一次scanf()?

有一次循环是处理回车这个字符的

前面输入的换行符也被当做输入了
for (int i=0; i <10; i )
{
printf("%d\n",i);
fflush(stdin); //当输入是用来清空缓冲!输出是用来写入!
scanf("%c",&a);
}

在第一次执行scanf的时候,你输入一个字符,按一下回车。

于是,输入缓存区中,有了两个字符: 一个是你输入的,一个是换行符。

而此时,scanf("%c")只取走了第一个字符。

当第二次运行scanf的时候,它发现,缓存区中,还有一个“回车”,于是,它就直接拿来用了。

2 std:string如何实现与LPTSTR的相互转换

string str="fdsjl";

LPSTR str1=str.c_str();

LPTSTR lp=_T("ddd");
char *a=new char[10];
WideCharToMultiByte(CP_OEMCP,NULL,lp,-1,a,6,NULL,FALSE);
string str(a);
先转化成char* 然后再转换成string

3 关于输入结束

输入缓冲是行缓冲。当从键盘上输入一串字符并按回车后,这些字符会首先被送到输入缓冲区中存储。每当按下回车键后,cin.get() 就会检测输入缓冲区中是否有了可读的数据。cin.get() 还会对键盘上是否有作为流结束标志的 Ctrl Z 或者 Ctrl D 键按下作出检查,其检查的方式有两种:阻塞式以及非阻塞式。

阻塞式检查方式指的是只有在回车键按下之后才对此前是否有 Ctrl Z 组合键按下进行检查,非阻塞式样指的是按下 Ctrl D 之后立即响应的方式。如果在按 Ctrl D 之前已经从键盘输入了字符,则 Ctrl D的作用就相当于回车,即把这些字符送到输入缓冲区供读取使用,此时Ctrl D不再起流结束符的作用。如果按 Ctrl D 之前没有任何键盘输入,则 Ctrl D 就是流结束的信号。

Windows系统中一般采用阻塞式检查 Ctrl Z、Unix/Linux系统下一般采用非阻塞式的检查 Ctrl D。楼主是在Windows系统下,因此使用阻塞式的 Ctrl Z 来标识流的结束。

这种阻塞式的方式有一个特点:只有按下回车之后才有可能检测在此之前是否有Ctrl Z按下。还有一个特点就是:如果输入缓冲区中有可读的数据则不会检测Ctrl Z(因为有要读的数据,还不能认为到了流的末尾)。还有一点需要知道:Ctrl Z产生的不是一个普通的ASCII码值,也就是说它产生的不是一个字符,所以不会跟其它从键盘上输入的字符一样能够存放在输入缓冲区。明白了这几点之后就可以来解释楼主提出的问题了。

如果您需转载 论坛总结2,请注明来自LinuxGoo.com,其版权归原作者所有。请广大网友留言时遵纪守法,使用文明用语。如果您在应用中有什么问题,请在下面留言,我们会尽快解答。
来顶一下
近回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
相关文章
栏目热门