将输入复制到输出,对于包含一个或多个空白的字符串,输出一个空白

时间:2011-07-15 23:06:56

标签: c input implementation

这是问题所在 例如

in = "a    b\nab  c\ndd";
out = "a b\nb c\ndd"
Here is my C code

while(c=getchar()!=EOF){
  if(c==' '){
      while( (c1=getchar()) == ' '); // ignore all other contiguous blank
      putchar(c); // output one blank
      putchar(c1);  // output the next non-blank character             
  }
  else putchar(c);
}

我可以使用缩小尺寸的实现吗?

3 个答案:

答案 0 :(得分:2)

假设您只删除' '

int c;
char space_found = 0;

while ( ( c = getchar() ) != EOF) {
   if ( (!space_found) || (c != ' ') ) { // if the previous is not a space, or this is not a space
       putchar(c);
   }
   space_found = (c == ' '); // (un)set the flag
}

您可以更改它以使用简单的宏检查任何空白区域:

#define is_white_space(X) ( ( (X) == ' ' ) || ( (X) == '\t' ) || ( (X) == '\n' ) )

并将c == ' '替换为

答案 1 :(得分:0)

如果你不介意对“单词”的大小进行人为限制,那么很容易将它缩短一点:

// pick your limit here:
char word[256];

// and be sure the length here matches:
while (scanf("%255s", buffer))
    printf(" %s", buffer);

答案 2 :(得分:0)

  1. 尝试阅读角色。
  2. 如果输入缓冲区不为空,则输出先前读取的字符。否则跳到第6步。
  3. 如果先前读取的字符是空格,请继续获取字符,直到收到非空格字符。
  4. 如果输入缓冲区不为空,则输出最近读取的字符。
  5. 转到第1步。
  6. 结束实施
  7. 示例实施:

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