我正在阅读“ 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
为什么我得到的是超高数字而不是正确的数字?
答案 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键逐步执行。