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,因此我了解它的目的。

4

4 回答 4

2

此代码的目的是复制文本,如果有多个空格,则' '连续打印一个空格。

变量inspace用于跟踪上次打印的 char 是 scape 还是 non-space。
如果inspace为零表示打印的字符不是空格。
if is one 表示最后inspace一次打印空间。

因此,如果inspace下一次 scape 为零,则可以在读取 scape 时打印,如果inspace是 1,则找到下一个连续的 scape,因此不打印空间。

查看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);
}
于 2013-03-19T10:55:39.920 回答
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);
        }


    }
}
于 2016-02-23T03:29:51.010 回答
1

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

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

于 2013-03-19T10:54:27.263 回答
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);
        }
    } 
            
}
于 2020-07-07T06:22:23.397 回答