скопировать ввод в вывод, для строки с одним или несколькими пробелами, вывести один пробел - PullRequest
0 голосов
/ 16 июля 2011

вот проблема например

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 ]

2 голосов
/ 16 июля 2011

Если вы удалите только ' ':

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 == ' ' на него

0 голосов
/ 16 июля 2011
  1. Попытка прочитать символ.
  2. Если входной буфер не пустой, выведите ранее прочитанный символ. В противном случае перейдите к шагу 6. ​​
  3. Если ранее прочитанный символ был пробелом, продолжайте получать символы, пока не получите символ без пробелов.
  4. Если входной буфер не пустой, выведите недавно прочитанный символ.
  5. Перейти к шагу 1.
  6. Завершение реализации

Пример реализации:

while ((c = getchar ()) != EOF)
  {
    putchar (c);
    if (c == ' ')
      {
        while ((c = getchar ()) == ' ')
          {}
        if (c != EOF)
          {
            putchar (c);
          }
      }
  }
0 голосов
/ 16 июля 2011

Если вы не возражаете против искусственного ограничения размера «слова», его довольно легко сократить совсем немного:

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

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