如果之前有空白/制表符,如何停止输出空白/制表符?

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

我正在使用 K&R 的“C 编程语言”,目前正在做练习 1-12 [1]。问题不在于解决练习,而在于尝试解决由此产生的错误之一。

我的解决方案。

#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);
            prev = c;
        }
    }
}

我开始认为我没有能力用我所知道的来解决这个“错误”。也许我需要存储删除了多余空白或制表符的输入,然后输出带有制表符的空白或制表符。但这似乎很复杂。

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

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

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

第二个发布的代码是解决问题的一个非常好的起点。

#include <stdio.h>

int main(void)
{
    int c = 0;
    int prevc = 0;

    while ((c = getchar()) != EOF)
    {
        if (c == ' ' && prevc == ' ')
        {
            continue;
        } else if (c == ' ')
        {
            putchar('\n');
        } else
        {
            putchar(c);
        }
        prevc = c;
    }
}

只需更改第一个 esle/if 即可。第一个if不需要输出任何东西,继续就足够了。
查看

isspace ( )
以提供其他空白字符。

© www.soinside.com 2019 - 2024. All rights reserved.