我正在阅读K&R,其中一个代码对单词进行计数。我决定尝试制作自己的代码版本,但是使用我当前的代码,EOF(就像我在Linux上一样Ctrl+D
)无法正常工作。
#include <stdio.h>
int main(void) {
int c, wc = 0;
while((c = getchar()) != EOF) {
while(c != ' ' && c != '\t' && c != '\n') {
wc++;
}
}
printf("%d", wc);
return 0;
}
答案 0 :(得分:2)
以下示例更接近于计算个单词:
#include <stdio.h>
int main(void) {
int c, wc = 0;
int sep = 1;
while((c = getchar()) != EOF) {
if (c != ' ' && c != '\t' && c != '\n') {
if ( sep ){
wc++;
sep = 0;
}
}
else
sep = 1;
}
printf("%d", wc);
return 0;
}
答案 1 :(得分:1)
while((c = getchar()) != EOF) {
while(c != ' ' && c != '\t' && c != '\n') {
wc++;
}
}
第一次按下一个键时,内部while循环会触发,并且永远不会退出,除非第一个键是该条件中的一个。
因此,如果您按“ A”,则内部while循环将永远持续下去。
您需要将while
替换为if
。并修改条件,使wc
仅在遇到getchar()
或其他指定字符时才会增加,而.tooltip
将被执行以获取下一个字符。
答案 2 :(得分:0)
我不得不在内部getchar()
循环中添加while
。
#include <stdio.h>
int main(void) {
int c, wc = 0;
while((c = getchar()) != EOF) {
while((c = getchar()) != ' ' && c != '\t' && c != '\n');
wc++;
}
printf("%d\n", wc);
return 0;
}
答案 3 :(得分:-1)
我知道我在作弊,但是此示例显示了更高级别的功能如何使程序更清晰。 scanf
的{{1}}转换为我们进行了分词。该示例使用%s
赋值抑制字符,这消除了为我们实际上不想知道的任意长单词提供空间的需要。
*
如果不得不自己动手,我会写子例程。看看#include <stdio.h>
int wordcount = 0;
int main(void) {
while(scanf("%*s") != EOF)
{
wordcount++;
}
printf("%d\n", wordcount);
return 0;
}
看起来有多干净!
main