计算换行符,空格和制表符

这个问题来自K&R p。 20:编写程序来计算空格,制表符和换行符。

这是我的尝试:

#include  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才能注册。 我不知道为什么。 谢谢!

 if(character == (' ' || '\n' || '\t')) 

测试character是否等于(' ' || '\n' || '\t')的结果(结果为1,表示||的结果为真)。 您需要针对三个可能值中的每一个单独测试它,例如,

 if(character == ' ' || character == '\n' || character == '\t') 

你可能遇到的一个问题是你的病情。

尝试以下方法:

 if (character == '\n' || character == ' ' || character == '\t') { ++ whitespace; } 

你的while语句中的括号是错误的,它应该是

 while( (character = getchar()) != EOF) 

你赋予了字符test getchar() != EOF的值,对于任何真正读过的字符都是1。

你的代码的问题是if(character == (' ' || '\n' || '\t'))语句。 语句(' ' || '\n' || '\t')相当于32 || 13 || 9 32 || 13 || 9 32 || 13 || 9 (每个字符由等效的ASCII值替换)等于1因为任何非零的东西在C / C ++中都被认为是true ,所以if(character == 1)有效的if(character == 1) 。 现在我认为您可以解决代码中的问题。

书籍也说分别计算空白,制表符和换行符,你试图计算总数,所以做这样的事情。

 if(character == ' ') ++blanks; if(character == '\t') ++tabs; if(character == '\n') ++newlines; 

如果你想要一个完整的解决方案,这里是我写了很久的一个。

 #include  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; } 

isspace将作为宏或函数提供,具体取决于您的系统,并且您不必再猜测可能构成环境空白的内容。 严格来说,它可能是您系统上的以下所有字符。 GNU C当然这么认为。

 ' ' space '\f' formfeed '\n' newline '\r' carriage return '\t' horizontal tab '\v' vertical tab 

这是你如何进行测试的方法。

  #include  while((character = getchar() != EOF) { if (isspace(character)) whitespace++; } 

以上示例在技术上是正确的。 它仅在调用EOF (文件结束)指示符后才打印值。 但是,我认为这个练习有更好的解释(1.8),所以让我提出一个替代方案。 下面的代码将在每个新行之后立即打印新行,制表符和空白。

 #include  #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); } } }