我想读两个char,所以我做了以下代码:
main() {
char a,b;
printf("\nEnter the first char.. ");
a=getchar();
printf("\nEnter the second char.. ");
b=getchar();
b=getchar(); //<--I've to add this sentence because the previously doesn't work
printf("\nFirst char --> %c",a);
printf("\nSecond char --> %c",b);
}
代码不应该有效,但确实如此。输出是正确的:
第一个字符 - &gt; z
第二个字符 - &gt; z('z'或我想去的那个角色)
如果我删除第二个getchar()
,则输出为:
第一个字符 - &gt; ž
第二个字符 - &gt; (这里没有炭)
getchar()
而不会出现任何错误?因为fflush(stdin)
之前的getchar()
不起作用。
答案 0 :(得分:7)
试试这个:制作一个文件data
,两个字节,其大小恰好包含ab
。现在说:
./myprogram < data
瞧。
关键是,当您操作终端并按下a
后按Enter键时,您将向流程发送两个字符,首先是a
,然后是{ {1}},换行符。所以第二个\n
选择换行符。
(并且您的终端不允许您在不按Enter的情况下发送单个字符,因为它有一个行缓冲区,它在发送之前填满。)
简而言之,getchar
是一个糟糕的I / O原语,您几乎总是希望getchar
读取整行并处理它们。
答案 1 :(得分:2)
如其他答案所示,问题是由回车引起的。
有很多方法可以解决这个问题,有些方法比其他方法更复杂。因此,我将指出我发现的最简单的方法:
作为the GNU website indicate,最合适的函数是getc(stream)
,我引用:
这就像 fgetc 一样,除了它是允许的(和 典型的)它被实现为评估流的宏 参数不止一次。 getc 经常被高度优化,所以它是 通常用于阅读单个字符的最佳功能。
我将其付诸实践但仍然存在 CR 问题,因此我打印了此功能的结果并注意到返回10时CR < / strong>即可。 在此之后,我试图获得代码的功能和清晰度。尽一切可能,现在我的代码如下:
main() {
char a,b;
printf("\nEnter the first char.. ");
if ((a=getc(stdin))==10) a=getc(stdin);
printf("\nEnter the second char.. ");
if ((b=getc(stdin))==10) b=getc(stdin);
printf("\nFirst char --> %c",a);
printf("\nSecond char --> %c",b);
}
好的输出:
第一个字符 - &gt; ž
第二个字符 - &gt; z(&#39; z&#39;或我想去的地方)
我已经了解到所有程序都需要他们自己的解决方案,与其他程序不同,这就是(我认为)的原因,因为它有很多功能。我能说的是&#34;总是要调整程序。也许这句话对我有用,但不保证能用于其他代码。&#34;
感谢所有帮助我的人!
答案 2 :(得分:1)
听起来你的getchar()
函数会在键盘缓冲区中留下换行符。这意味着第一个b=getchar();
读取换行符,第二个读取您期望的实际输入。如果您有ignore()
函数可用,则更优雅的方法是忽略换行符。
答案 3 :(得分:0)
getchar()只获得一个字符。换行需要一个字符,因此你需要在代码中使用额外的getchar()来获得所需的输入/输出。