C语言K&R练习1-9

4

我在这里是新手,对编程逻辑也比较陌生。为了提高自己的技能,我开始阅读这本优秀的文献。我真的觉得我很好地掌握了这些概念,但这个练习似乎让我措手不及。我可以编写程序,但我看到的一些示例似乎引入了一些书中尚未涵盖的概念,例如这里的示例。 inspace 似乎发挥着比程序员创建的变量更多的功能。

#include <stdio.h>

int main(void)
{
    int c;
    int inspace;

    inspace = 0;
    while((c = getchar()) != EOF)
    {
        if(c == ' ')
        {
            if(inspace == 0)
            {
                inspace = 1;
                putchar(c);
            }
        }

        /* We haven't met 'else' yet, so we have to be a little clumsy */
        if(c != ' ')
        {
            inspace = 0;
            putchar(c);
        }
    }    
    return 0;
}

在下一个例子中,pc 似乎在处理计算空格的事情,但我不确定具体是什么。我已经成功创建了一个程序来完成这个任务,但是它只使用了我创建的变量 c,因此我理解它的目的。

请尽量明确提出问题,而不是暗示一个问题。 - Bernhard Barker
将“inspace”视为布尔值(0为假)。 - PW.
啊哈,非常感谢 PW 的快速帮助!非常清晰易懂 :) 很棒! - user2186062
你遇到这样奇怪的代码,只是因为你正在阅读一本关于已经过时的C语言版本的恐龙书。C语言中已经有布尔类型存在了14年。我建议你从更新的资料中学习C语言。 - Lundin
看起來這本書在學習 C 語言和程式邏輯方面仍被視為一個好工具。繼續閱讀一些內容後,我可能會轉而閱讀一本關於 Objective-C 的書。此外,這本書與我的復古眼鏡非常搭配。 - user2186062
4个回答

2
花了我一些时间,但我认为这就是答案。
#include <stdio.h>

main()
{
    int c, blank;
    blank = 0;

    while ((c=getchar()) != EOF){
        if (c == ' '){
            if (blank == 0){
                printf("%c", c);
                blank = 1;
            }

        }
        if (c != ' '){
            if (blank == 1){
                blank = 0;
            }
            printf("%c", c);
        }


    }
}

2
这段代码的目的是复制文本,如果有超过一个空格' '连续出现,则只打印一个空格。
变量inspace用于跟踪上次打印的字符是否为空格。
如果inspace为零,则意味着打印了一个非空格字符;
如果inspace为一,则意味着上次打印了一个空格。
因此,如果inspace为零,则下一次可以在读取空格时打印空格。如果inspace为一,则找到下一个连续的空格,因此不要打印空格。
请参见C是当前读取的字符。(阅读注释)
  if(c == ' ')  // currently space read
    {
      if(inspace == 0) // last time non-space printed, So space can be print
      {
        inspace = 1;   // printing space so switch inspace 1
        putchar(c);   // print space
      }
    }

下一个 if
if(c != ' ') // A char not space read, its to to print unconditionally  
{
  inspace = 0;  // remember that non-scape print
  putchar(c);
}

1

inspace本质上是一个变量,用于指示您是否处于“刚看到空格”状态。当您看到空格后,进入此状态,当您看到非空格时,退出此状态。仅当您不处于inspace状态时才打印输入内容,因此您不会打印多个相邻的空格。

我成功创建了一个程序来完成这个任务,但它只使用了我创建的变量c,因此我理解它的目的。 如果输入是“hello world”,那么输出是精确的吗?您发布的程序将输出“hello world”(将单词之间的多个空格压缩为一个)。


是的,它具有相同的目的...现在我明白了,这是一个很酷的做法! - user2186062

0

我之前也遇到了同样的问题,但最终找到了一个可行的程序。

    #include<stdio.h>

/* copy input to its output, replacing each
   string of one or more blanks by a single blank */

int main()
{
    int c, nspace=0;
    while((c=getchar()) != EOF){
        if(c==' ') ++nspace;
        else{
            if(nspace >= 1){
                printf(" ");
                putchar(c);
                nspace=0;
            }
            else
                putchar(c);
        }
    } 
            
}

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