将多个空格和制表符替换为单个空格和制表符的程序

3

我正在阅读 The C Programming Language

我使用了这个程序将多个空格替换为单个空格,但是我想同时将多个空格和制表符替换为单个空格和制表符。

#include <stdio.h>

int main() {
    int c;
    while ((c = getchar()) != EOF) {
        if (c == ' ') {
            putchar(c);
            while ((c = getchar()) == ' ')
                ;
        }
        if (c != ' ')
            putchar(c);
    }
}

2
“同时将单个空格和制表符转换”不是很清楚。您应该提供一些给定输入和期望输出的示例。使用\t来描述制表符。 - Oka
1个回答

1
你的程序几乎正确:如果文件以空格结尾,内部循环 while ((c = getchar()) == ' '); 将停止并且到达文件结尾,将会把 c 的值设为 EOF,这将作为字节 0xFF 输出(如果 EOF 被定义为 -1,那么这是最常见的值)。
你应该检查这种可能性:
#include <stdio.h>

int main() {
    int c;
    while ((c = getchar()) != EOF) {
        if (c == ' ') {
            putchar(c);
            while ((c = getchar()) == ' ')
                continue;
            if (c != EOF)
                break;
        }
        putchar(c);
    }
    return 0;
}

不清楚你所说的“将多个空格和制表符替换为单个空格和制表符”的意思。

要将空格和制表符替换为单个空格,只需测试两个字节值即可:

#include <stdio.h>

int main() {
    int c;
    while ((c = getchar()) != EOF) {
        if (c == ' ' || c == '\t') {
            putchar(' ');
            while ((c = getchar()) == ' ' || c == '\t')
                continue;
            if (c != EOF)
                break;
        }
        putchar(c);
    }
    return 0;
}

相反,如果你想用一个空格替换多个空格和一个制表符替换多个制表符,可以采用不同的方法:

#include <stdio.h>

int main() {
    int c, last = EOF;
    while ((c = getchar()) != EOF) {
        if (c == ' ' || c == '\t') {
            if (c == last)
                continue;
        }
        putchar(c);
        last = c;
    }
    return 0;
}

这种方法可以用于原始问题,并产生更简单的代码:

#include <stdio.h>

int main() {
    int c, last = EOF;
    while ((c = getchar()) != EOF) {
        if (c != ' ' || c != last) {
            putchar(c);
            last = c;
        }
    }
    return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接