空间没有被替换

时间:2016-08-30 02:50:05

标签: c string

我通过阅读K& R来学习。我试图有条不紊地确保在继续之前理解这些概念。

其中一个练习要求编写一个程序,将输入复制到输出"用一个空格替换一个或多个空格的每个字符串。"

我写了以下内容,但即使存在多个连续的空格,它也会逐字输出输入:

#include <stdio.h>

main()

{
    int c, d, a;

    c = getchar();
    while (c != EOF) 
    {
        a = c;

        if (c == ' ' && d == ' ')
        {
            a = 0;
        }

        d = c;

        putchar(a);
        c = getchar();
    }
}

我在这里做错了什么?我不太喜欢这本书,所以我觉得我错过了一些非常简单的东西...

3 个答案:

答案 0 :(得分:2)

评论中有一些好处:

  • 使用有意义的变量名称
  • putchar(0)与不写任何内容不一样
  • 所有变量都需要初始化

我还会提出一个建议:

  • while循环应该读取字符并检查EOF,如下所示

(假设您有第2版的K&amp; R,请参阅第17页的第1.5.1节以获取详细说明。)

以下是我编写代码的方法:

#include <stdio.h>

int main(void)
{
    int c;
    int oldc = 'a';

    while ( (c=getchar()) != EOF )
    {
        if (oldc != ' ' || c != ' ')
            putchar(c);
        oldc = c;
    }
}

答案 1 :(得分:1)

我想通了,虽然我对我的解决方案并不完全满意:

%% some code omitted ...
F = fun() -> blah, blah, timer:sleep(10000) end,
f(F), %% like `spawn(F), but doesn't return until 10 seconds has passed`
%% ...

感谢那些评论的人。除了我的逻辑问题,我错误地假设#include <stdio.h> main() { int c, d; d = 'a'; c = getchar(); while (c != EOF) { if (c != ' ') putchar(c); if (c == ' ' && d != ' ') putchar(c); d = c; c = getchar(); } } 与打印零长度字符串相同。

答案 2 :(得分:0)

您的代码中存在问题,因为您在第一次循环运行初始化之前测试d

这是我想出的解决方案。它并不是效率最高的,但我相信它很容易理解,只能在变量c方面起作用。

#include <stdio.h>

int main(void)
{
    int c;
    c = getchar();
    while(c != EOF)
    {
        putchar(c);
        if(c == ' ') /* If the last character was a space */
        {
            do /* Then keep getting new characters and overwrite */
            {
                c = getchar();
            } while(c == ' '); /* as long as spaces keep coming */
        }
        else
            c = getchar(); /* if a space wasn't received, then just get the next */
    }
    return 0;
}

如上所述,一旦程序收到空格,它就会进入一个循环,覆盖C直到找到下一个非空格字符,然后它就会打印出C中的任何内容。