[英]counting newlines, spaces, and tabs
这个问题来自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才能注册。 我不知道为什么。 谢谢!
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 == ' ')
++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;
}
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++;
}
以上示例在技术上是正确的。 它仅在调用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);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.