使用 getchar() 计算用户输入的数量给出了预期结果的两倍,为什么?
Counting number of user input using getchar() gives double the expected result, why?
在下面的例子中,来自"C programming"一本书,当输入字符时,程序计数两次。
main(){
long nc;
nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
}
输出:
a
b
c
d
e
f
12
怎么了?
我正在使用 Ubuntu 和 gcc 编译器。
计数正常。 getchar()
正在考虑按 ENTER 键,作为换行符 \n
。所以 6 user 输入和 6 个换行符。计数匹配。
如果你不希望换行被计为输入,你需要在getchar()
return值不是时增加计数器\n
,类似于
while ( (c = getchar()) != EOF) {
if ( c != '\n') ++nc;
}
会完成任务的。注意,c
应该是 int
类型才能处理 EOF
.
也就是说,根据 C99
或 C11
,对于托管环境,main()
的签名至少应为 int main(void)
以符合标准。
在下面的例子中,来自"C programming"一本书,当输入字符时,程序计数两次。
main(){
long nc;
nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
}
输出:
a
b
c
d
e
f
12
怎么了?
我正在使用 Ubuntu 和 gcc 编译器。
计数正常。 getchar()
正在考虑按 ENTER 键,作为换行符 \n
。所以 6 user 输入和 6 个换行符。计数匹配。
如果你不希望换行被计为输入,你需要在getchar()
return值不是时增加计数器\n
,类似于
while ( (c = getchar()) != EOF) {
if ( c != '\n') ++nc;
}
会完成任务的。注意,c
应该是 int
类型才能处理 EOF
.
也就是说,根据 C99
或 C11
,对于托管环境,main()
的签名至少应为 int main(void)
以符合标准。