Exercise 1-12. Write a program that prints its input one word per line.
作者要求我们对输入的文本中的(伪)单词按行输出,每行输出一个。
有个小问题,如果是以空白符开头的输入,是否要保留开头的空白符。笔者在自己的程序中做了不保留的处理。
为了达到“每当(伪)单词结束就换行”的效果,笔者这里用了一个状态记录变量 state 。
如果当前记录的字符不是空白符,那么我们将 state 的值设置为 IN 。
那么如果我们当 state == IN 的时候读取到了空白符,则直接输出一个换行符,同时将 state 的值设置为 OUT 。
如果我们当 state == OUT 的时候读取到了空白符,这说明我们已经在之前单词的基础上换过行了。就不需要额外再换行,我们什么也不做。
为了舍去开头的空白符,我们还得在读取第一个字符之前将 state 初始化为 OUT 。
完整代码如下:
#include <stdio.h>
#define IN 1
#define OUT 0
int main(void) {
int c, state;
state = OUT;
while ((c = getchar()) != EOF) {
if (c != ' ' && c != '\t' && c != '\n') {
state = IN;
putchar(c);
}
else if (state == IN) {
putchar('\n');
state = OUT;
}
}
return 0;
}
运行结果如下:
> ./Exercise1_12 < hello.c
#include
<stdio.h>
main()
{
printf("hello,
world\n");
}