如何在C字每行输出中防止空行并删除多余空格? [已关闭]

问题描述 投票:0回答:1

我正在阅读 K&R 的《C 编程语言》,目前正在做练习 1-12。我面临的问题不是完成练习本身,而是修复由于我的代码而出现的错误。

当遇到两个或多个空格时,代码会产生不需要的空行。我想确保输出没有空行并且多余的空格被修剪。

我的解决方案。

#include <stdio.h>

int main(void)
{
    int c;
    
    while ((c = getchar()) != EOF)
    {
        if (c == ' ' || c == '\t')
        {
            printf("\n");
        }
        else
        {
            putchar(c);
        }
    }
}

输出有问题

bash >>> ./Exercises/ex12
hello  everyone
hello
 
everyone

我尝试根据Ex 1-9 [2]解决它,但没有成功。

#include <stdio.h>
#define PREVCHAR 'a'

int main(void)
{
    int c, prevc = PREVCHAR;
    
    while ((c = getchar()) != EOF)
    {
        if (c == ' ' && prevc == ' ')
        {
            printf("");
        } else if (c == ' ' && prevc != ' ')
        {
            printf("\n");
        } else
        {
            putchar(c);
            prevc = c;
        }
    }
}

[1] = 编写一个程序,每行打印一个单词的输入。

[2] = 编写一个程序将其输入复制到输出,用一个空格替换每个包含一个或多个空格的字符串。

c if-statement input output kernighan-and-ritchie
1个回答
1
投票

我认为你想要实现以下输出:

hello 
everyone

出现空行的原因是您的算法只是用新行替换每个空格/制表符。 您的主要想法是简单地检查前一个字符是否是空格或制表符是否正确。 问题是,你只设置

prev
,以防它不是空格。 因此,
prev
永远不会是空格或制表符。

此外,我建议这样做:

#include <stdio.h>

int main(void)
{
    int c;
    bool previousWasBlank = false;
    
    while ((c = getchar()) != EOF)
    {
        if (c == ' ' || c == '\t')
        {
            if (!previousWasBlank)
                printf("\n");

            previousWasBlank = true;
        }
        else
        {
            putchar(c);
            previousWasBlank = false;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.