C程序打印出的数字超出预期

时间:2018-12-04 01:02:41

标签: c

我正在阅读“ C编程语言第二版”,练习1.8告诉我编写一个计算输入中的空格,制表符和空格的程序。当前代码可以正确执行所有操作,除了计算适当数量的空白和制表符。下面是我的代码

#include <stdio.h>

int main() {
    int c, blankCount, tabCount, newlineCount;

    blankCount, tabCount, newlineCount = 0;
    while((c = getchar()) != EOF) {
        if(c == ' ') {
            blankCount++;
        } else if(c == '\t') {
            tabCount++;
        } else if(c == '\n') {
            newlineCount++;
        }
    }

    printf("Number of blanks in input: %d\n", blankCount);
    printf("Number of tabs in input: %d\n", tabCount);
    printf("Number of newlines in input: %d\n", newlineCount);
}

使用此输入

this is a test
this    is a tab

我得到这个输出

Number of blanks in input: 2078001861
Number of tabs in input: 32766
Number of newlines in input: 2

期望的输出是这个

Number of blanks in input: 3
Number of tabs in input: 1
Number of newlines in input: 2

为什么我得到的是超高数字而不是正确的数字?

4 个答案:

答案 0 :(得分:3)

您有未初始化的变量。初始化行:

int c, blankCount, tabCount, newlineCount;

实际上并没有将它们初始化为任何内容(a)和赋值行:

blankCount, tabCount, newlineCount = 0;

只需评估三个子表达式(b)并丢弃结果。只有 third 子组件newlineCount = 0具有将该变量归零的副作用。

其他值仍将具有任意值,这意味着它们的最终值将无法正确指示每个值。

您应该拥有的类似于:

int c, blankCount = 0, tabCount = 0, newlineCount = 0;

作为函数的初始化行,并完全摆脱赋值行。


(a)涵盖在例如C11 6.7.9 Initialization /10中:

  

如果未自动初始化具有自动存储期限的对象,则其值不确定。


(b)随着对C语言的了解越来越深入,您会意识到它们 are 表达式。 “声明” pi = 3.14159实际上是一个导致pi的表达式,其副作用是首先将其设置为该值。这就是为什么您可以做类似twopi = 2 * (pi = 3.14159)之类的事情,也是为什么oldi = i++有效的原因。

它还可以使人感到奇怪,例如能够编译该语句:

42;

:-)

答案 1 :(得分:1)

更改:

int c, blankCount, tabCount, newlineCount;

进入:

int c, blankCount = 0, tabCount = 0, newlineCount = 0;

您的行(前行):

blankCount, tabCount, newlineCount = 0;

仅将其他两个newLineCount不是归零(这是三个独立的语句,前两个[有效]是无操作)。

它们等效于:

blankCount;
tabCount;
newlineCount = 0;

如果您使用-Wall进行编译,则会收到警告:

init.c: In function ‘main’:
init.c:6:15: warning: left-hand operand of comma expression has no effect [-Wunused-value]
     blankCount, tabCount, newlineCount = 0;
               ^
init.c:6:25: warning: left-hand operand of comma expression has no effect [-Wunused-value]
     blankCount, tabCount, newlineCount = 0;
                         ^

答案 2 :(得分:1)

这里的问题是这一行:

1543415707810089051

您可能认为正在为所有变量分配零。 为此,您需要执行以下操作:

1

如果您改用逗号,则实际上是在评估 blankCount, tabCount, newlineCount = 0; ,然后是blankCount = tabCount = newlineCount = 0; ,然后是blankCount,并返回评估结果的tabCount

答案 3 :(得分:0)

在定义变量之前应进行初始化,否则,变量将变得不确定,如果使用Visual Studio,则可以按F11键逐步执行。