了解K& R的练习

时间:2013-12-14 22:20:53

标签: c unix ascii

这个程序是K& R书中的C程序设计语言:

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

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

int main(void)
{
      int c, lastc;

      lastc = NONBLANK;
      while ((c = getchar()) != EOF){
            if ( c != ' ')
                putchar(c);
            if ( c == ' ')
                if (lastc != ' ')
                    putchar(c);

            lastc = c;

            }
       } 
}

我只是想知道这个程序如何在无聊的细节中运作。

2 个答案:

答案 0 :(得分:1)

坎。运动?无聊的细节?

    #include<stdio.h>
    #define NONBLANK 'a'               /* a fake char to use later */
    main()
    {
      int c, lastc;

      lastc = NONBLANK;                /* now last c == char 'a' */
      while ((c = getchar()) != EOF){  /* parse input (stdin), char by char */
        if ( c != ' ')                 /* if the char is a *not* a space ..*/
        putchar(c);                    /* then write it on stdout; */
        if ( c == ' ')                 /* if it is a space ..*/
          if (lastc != ' ')            /*.. and lastc is *not* a space ..*/
            putchar(c);                /* then write it on stdout; */
        lastc = c;                     /* Make lastc be equal to the current */
                                       /* parsed char, and loop up to while */
      }
   }

PS:第一次在这里..抱歉格式化混乱。

HTH

- michel macron(又名cmic)

答案 1 :(得分:0)

while循环继续执行,只要它从stdin获得的字符不是EOF

while((c = getchar()) != EOF)

声明了两个char变量:clastc。要使此逻辑起作用,必须知道当前字符和前一个字符。最初,lastc没有值,但仍然使用它:

if(lastc != ' ')
    putchar(c);

当程序启动lastc时,可能会有一个!= ' '的垃圾值。当你将它声明为一个合理的值时,定义这个变量是一个非常好的主意:

int c, lastc = ' ';

逻辑如下:

stdin读取当前字符。如果它不是空格字符(' '),则会将其写入stdout。如果是空格,则仅当前一个字符不是空格时,才会将空格写入stdout。如果前一个字符是空格,则忽略当前空格,如果stdin中有一系列空格字符,则只打印一个空格。