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码值,也就是说它产生的不是一个字符,所以不会跟其它从键盘上输入的字符一样能够存放在输入缓冲区。明白了这几点之后就可以来解释楼主提出的问题了。
1/2 1 2 下一页 尾页 |