我正在尝试在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
为什么会这样?我的第一个想法是,它可能是一个整数的最小可能数,但我检查了,我不相信它。
答案 0 :(得分:3)
您没有初始化nl
和tabs
,因此您的程序有未定义的行为。
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;