这个问题来自K& R p。 20:编写一个程序来计算空格,制表符和换行符。
这是我的尝试:
#include <stdio.h>
int main()
{
int character, whitespace = 0;
printf("Enter some text, and press Ctrl-d when you're done.\n\n");
while((character = getchar() != EOF) {
if(character == (' ' || '\n' || '\t')) {
++whitespace;
}
}
printf("\nYour text contains %d spaces, tabs, and lines.\n", whitespace);
return 0;
}
该程序不起作用。无论用户文本包含多少空格,制表符和换行符,它总是给出答案0。有谁能看到这个问题?还有一件奇怪的事情:我必须按两次Ctrl-d才能注册。我不知道为什么。 谢谢!
答案 0 :(得分:18)
if(character == (' ' || '\n' || '\t'))
测试character
是否等于(' ' || '\n' || '\t')
的结果(结果为1,表示||
的结果为真)。您需要针对三个可能值中的每一个单独测试它,例如,
if(character == ' ' || character == '\n' || character == '\t')
答案 1 :(得分:3)
你可能遇到的一个问题是你的病情。
尝试类似:
if (character == '\n' || character == ' ' || character == '\t') {
++ whitespace;
}
答案 2 :(得分:1)
你的while语句中的括号是错误的,它应该是
while( (character = getchar()) != EOF)
您为测试getchar() != EOF
的值指定了字符,对于任何真正读过的字符,该值为1。
答案 3 :(得分:1)
您的代码问题是if(character == (' ' || '\n' || '\t'))
语句。语句(' ' || '\n' || '\t')
等同于32 || 13 || 9
(每个字符由等效的ASCII值替换)等于1
,因为任何非零事物都被视为C中的true
C ++,你有效地做if(character == 1)
。现在我认为您可以解决代码中的问题。
书籍也说分别计算空白,制表符和换行符,你试图计算总数,所以做这样的事情。
if(character == ' ')
++blanks;
if(character == '\t')
++tabs;
if(character == '\n')
++newlines;
如果你想要一个完整的解决方案,这是我很久以前写的一个。
#include <stdio.h>
int main(void)
{
int blanks, tabs, newlines;
int c;
blanks = 0;
tabs = 0;
newlines = 0;
do {
c = getchar();
if(c == ' ') {
++blanks;
}
else if(c == '\t') {
++tabs;
}
else if(c == '\n') {
++newlines;
}
}
while(c != EOF)
printf("Blanks: %d\nTabs: %d\nLines: %d\n", blanks, tabs, newlines);
return 0;
}
答案 4 :(得分:0)
isspace
将作为宏或函数提供,具体取决于您的系统,并且您无需再次猜测可能构成环境空白的内容。严格来说,它可能是您系统上的以下所有字符。 GNU C当然这么认为。
' '
space
'\f'
formfeed
'\n'
newline
'\r'
carriage return
'\t'
horizontal tab
'\v'
vertical tab
这就是你可以进行测试的方法。
#include <ctype.h>
while((character = getchar() != EOF) {
if (isspace(character)) whitespace++;
}
答案 5 :(得分:0)
以上示例在技术上是正确的。它仅在调用EOF
(文件结束)指示符后才打印值。但是,我认为这个练习有更好的解释(1.8),所以让我提出一个替代方案。下面的代码将在每个新行之后立即打印新行,制表符和空白。
#include <stdio.h>
#define EOL '\n'
/* Excercise 1.8 - K&R's book - 2nd edition. */
main()
{
int c, newlines, tabs, blanks;
newlines = 0;
tabs = 0;
blanks = 0;
while ((c = getchar()) != EOF)
{
if (c == '\n')
++newlines;
else if (c == '\t')
++tabs;
else if (c == ' ')
++blanks;
if (c == EOL) {
printf("Lines: %d\nTabs: %d\nBlanks: %d\n", newlines, tabs, blanks);
}
}
}