为什么我要重复介绍一下?

时间:2012-08-05 23:13:33

标签: c string char

我想读两个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()不起作用。

4 个答案:

答案 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()来获得所需的输入/输出。