繁体   English   中英

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

[英]c K&R count newlines, tabs and spaces

我正在尝试在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

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

您没有初始化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[])

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

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]

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

    nl=tabs= blanks = 0;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM