我正在解决K& R的其中一个练习,但我遇到了一个小问题。 练习是在其输入中打印单词长度的直方图。
这是我的代码:
#include <stdio.h>
#define IN 1
#define OUT 0
int main(){
//Histogram of the length of words
int c, state, len, i;
state = OUT;
printf("Histogram\n");
while ((c = getchar()) != EOF){
if (c != ' ' && c != '\n' && c != '\t' && c != '\r'){
state = IN;
len++;
} else if (state == IN){
for (i = 0; i < len; i++){
putchar('[');
putchar(']');
}
len = 0;
putchar('\n');
state = OUT;
}
}
return 0;
}
我使用的文本文件是:
Hello World! This is a text
该计划的输出是:
Histogram
[][][][][]
[][][][][][]
[][][][]
[][]
[]
可以看出,程序在打印出最后一个单词“text”的直方图之前终止。 这是因为Windows上的文本编辑器不会自动将'\ r \ n'放在最后吗?如果是这样,我该如何解决这个问题?
谢谢。
答案 0 :(得分:1)
当getchar()
返回EOF
时你的循环结束,所以你永远不会进入else if
。
示例:
#include <stdio.h>
#include <stdbool.h>
int main(void) {
printf("Histogram\n");
size_t len = 0;
bool running = true;
while (running) {
switch (getchar()) {
case EOF:
running = false;
case ' ':
case '\n':
case '\t':
case '\r':
if (len != 0) {
printf("\n");
len = 0;
}
break;
default:
printf("[]");
len++;
}
}
}
答案 1 :(得分:0)
移动测试:
while (true)
{
const int c = getchar();
if (c != ' ' && c != '\n' && c != '\t' && c != '\r' && c != EOF)
{
state = IN;
len++;
}
else if (state == IN)
{
// ...
}
if (c == EOF) break;
}