CodeSky 代码之空

随手记录自己的学习过程

C 一行输出一个单词

2014-02-21 12:06分类: C评论: 0

貌似以前也看到有一道题是这样的,这里发现了思维不够严密,比如我是这么写的:

1#include <stdio.h>
2
3#define IN 1
4#define OUT 0
5
6main(void)
7{
8    int c, state;
9
10    while ((c = getchar()) != EOF) {
11        if (c == '\t' || c == ' ')
12            printf("\n");
13        else
14            putchar(c);
15    }
16
17    return 0;
18}
19

很显然,这样我们就没有办法对“多余空格”的情况做出恰当的处理,要结合C 删除多余空格的思路思考。这样一想,K&R中的1.5.4的state的功能也很很容易就明白了。

换句话说,是为了避免多余空格对单次数量的误判,书中给了标准答案,我加了点注释。

1#include <stdio.h>
2
3#define IN 1
4#define OUT 0
5
6main(void)
7{
8    int c, state;
9
10    state = OUT;    // 默认在单词外,进入else if 循环
11
12    while ((c = getchar()) != EOF) {
13        if (c == '\t' || c == ' ' || c == '\n') {
14            // 如果前面的字符非空格(前面是一个单词),输出换行符
15            if (state == IN) {
16                printf("\n");
17                state = OUT;
18            }
19        } else if (state == OUT) {  // 如果输入不是if条件的三个 并且前面用三个断行 则新的单词开始记录
20            state = IN;
21            putchar(c);
22        } else  // state == IN 的情况 输出单词内的字符
23            putchar(c);
24
25    }
26
27    return 0;
28}
29
30

评论 (0)