c K& R计算换行符,制表符和空格

时间:2014-06-02 20:13:18

标签: c newline

我正在尝试在K& R书中练习1-8,但是在找到换行符的数量方面存在问题:

编写程序来计算空白,制表符和换行符。

#include <stdio.h>

main()
{
    int c, nl, tabs, blanks;

    nl, tabs, blanks = 0;
    while ((c = getchar()) != EOF)
    {
            if (c == '\n')
                    ++nl;
                    printf("%d\n", nl);
            if (c == ' ')
                    ++blanks;
            if (c == '\t')
                    ++tabs;
    }
    printf("\n Blanks: %d\nNewlines: %d\nTabs: %d\n\n", blanks, nl, tabs);
}

我自己运行程序,我收到的输出是:

Blanks: 32 
Newlines: -1216989677
Tabs: 25

为什么会这样?我的第一个想法是,它可能是一个整数的最小可能数,但我检查了,我不相信它。

3 个答案:

答案 0 :(得分:3)

您没有初始化nltabs,因此您的程序有未定义的行为。

nl, tabs, blanks = 0;

仅初始化blanks。它应该是

nl = tabs = blanks = 0;

还有一个错误:程序员意图和缩进都没有定义块,只有花括号{}执行:

if (c == '\n')
    ++nl;
printf("%d\n", nl);

我更正了块的缩进以使错误显而易见。不完全是你想要的,所以使用花括号将两个语句分组为一个块。

无论如何,考虑编写C89而没有弃用的兼容性功能或更好的C11 这意味着你必须提供适当的原型。可能适用于main

int main(void)
int main(int argc, char *argv[])

此外,启用更多警告,并争取无警告编译:{{1​​}}
这样做(包括阅读和处理警告)将帮助您以简单的方式识别和纠正许多错误。

答案 1 :(得分:3)

nl = tabs = blanks = 0;

使用-Wall编译,您将看到错误:

cc -Wall -c a.c
(...)    
a.c:4:4: warning: left-hand operand of comma expression has no effect [-Wunused-value]
a.c:4:7: warning: left-hand operand of comma expression has no effect [-Wunused-value]

答案 2 :(得分:2)

将此行nl, tabs, blanks = 0;更改为

    nl=tabs= blanks = 0;