printf在C中输出2次输出

时间:2014-08-05 06:48:47

标签: c

我刚开始通过书籍K& R开始学习C. 这是我的代码。

#include <stdio.h>
int main (){
    int c;
    char value = ((c = getchar()) != EOF);
    while (value){
        printf(" %c\n", c);
        printf("%d :: value : %d\n",__LINE__,value);
        value = ((c = getchar()) != EOF);
    }
    return 0;
}

这导致

a
 a
10 :: value : 1


10 :: value : 1
b
 b
10 :: value : 1


10 :: value : 1

我不明白为什么要打印value 2次?

5 个答案:

答案 0 :(得分:3)

不是两次,只有一次。另一个是你的输入。 例如,您输入&#39; a&#39;,控制台将显示&#39; a&#39;首先,然后程序将在运行到语句时再打印一次:

printf(" %c\n", c);

答案 1 :(得分:2)

这将继续执行这两个printf(),直到您在stdin上遇到EOF,这可能是由EOT(控制D或某些平台上的控件Z)发出信号。

原因是因为预测试条件为(值),其中值计算如下:

((c = getchar()) != EOF);

这意味着对stdin执行一个字符的阻塞读取,将其存储在堆栈分配的整数c中,然后将比较结果与EOF存储到char值中。这意味着char值应该真的可能是bool,而不是char,因为它的值只能是零或一。

答案 2 :(得分:2)

getchar()正在读取两个字符 - 您输入的字母,以及按“输入”时的换行符。

答案 3 :(得分:1)

在你的程序中做这个简单的改变:

#include <stdio.h>
int main ()
{
    int c;
    char value = ((c = getchar()) != EOF);
    while (value)
    {
        printf(" %d\n", c); //print the int value of the character
        printf("%d :: value : %d\n",__LINE__,value);
        value = ((c = getchar()) != EOF);
    }
    return 0;
}

现在输出变为:

a
 97 <-- ascii code of 'a'
9 :: value : 1
 10 <-- ascii code of newline (line feed)
9 :: value : 1
b
 98 <-- ascii code of 'b'
9 :: value : 1
 10
9 :: value : 1
abcd <-- you could also do this
 97
9 :: value : 1
 98
9 :: value : 1
 99
9 :: value : 1
 100
9 :: value : 1
 10
9 :: value : 1
<...>

显示每次读取字符时都会出现换行符(ASCII 10字符)。

答案 4 :(得分:0)

这只是因为你首先看到你刚在终端输入的字符,然后是程序打印的字符(第二个在右边稍微移位)。

但是,如果你在谈论value,那么它只出现一次。最左边的值是变量__LINE__的内容,另一个是value(请参阅 printf格式字符串以了解更多信息)。