getchar()的意外输出

时间:2017-08-09 15:45:04

标签: c getchar

char c = ' ';
while(c != 'x')
{       
    c = getchar();
    printf("threadFuncParam = %u\n", threadFuncParam);
}

在上面的代码片段中,每次输入一个字符时,print都会打印threadFuncParam值两次,因为我希望它只打印一次。 根据我的理解,它第一次进入,当条件为真,然后等待用户输入getchar调用输入一个字符时它将打印该值,然后如果输入字符不是x,它将等待getchar调用的另一个输入,但每当我输入一个字符时,我看到2为每个输入打印离子屏幕。我无法理解为什么?

我在这里尝试做的是,在主线程中我从用户和工作线程中获取单个字符串输入我正在递增一个每秒递增一次的计数器,我每次用户输入一个字符时打印该值输入直到用户输入' x'字符。

3 个答案:

答案 0 :(得分:2)

这里的一个简单问题是控制台(输入)只有在遇到回车键或stdin时才会将文本发送到ctr+d

因此,额外的\n会进入您的输入流。这会导致程序在下一次迭代中读取该字符。

一个简单的解决方案是读取流中的所有空格字符。

这可以通过多种方式完成 -

如果你需要丢弃任何空格字符(包括空格,制表符,vtabs,换行符),你可以添加

scanf(" ");
getchar();

之前

如果您只需要丢弃因按Enter键而产生的换行符,您可以添加

scanf("%*[\n]")
getchar();

之前

这会占用下一个字符前的所有\n。但不会吃空间。

最后,如果您只想丢弃1 \n

你可以做到

scanf("%*1[\n]");

请记住但是,在所有情况下,scanf应该在getchar()之前,因为scanf会等到它找到下一个非空格字符。

所有案例都是在@chux的评论的帮助下找到的。

答案 1 :(得分:2)

如果您尝试调试程序(学习编码的最佳方式),您会发现第二个值是每次10。在ASCII表中,您会发现这是新行的代码。在每个角色之后你要按哪个。然后通过快速&简单的搜索你会发现这个THREAD。问题在哪里描述,你很容易解决。

char c = ' ';
while(c != 'x')
{
    printf("threadFuncParam = %u\n", (char)c);
    fflush(stdout);
    if (scanf(" %c",&c) != 1)
    {
        // failed
    }
}

答案 2 :(得分:0)

我认为问题在于逻辑的应用方式。在检查条件之前打印请参阅此说明:

循环1:执行getchar()说出值' a'  printf()执行。
循环2:因为c =' a',条件为真。现在,getchar()用' x'执行。值。 再次执行printf() 循环3:条件被评估为假。循环终止。

所以基本上你应该改变你的逻辑。