Физико-математический лицей №30
Программирование
Примеры программ на Си
 

16. Удалить из строки все лишние пробелы.

< Предыдущая ^ Назад к списку задач Следующая >
/* FILENAME : task_1_16.c */
/* Eugene V. Ogurtsov */
/* Last update : 26.05.2000 */
/* Удалить из строки все лишние пробелы. */
/* Написать программу, которая вводит с клавиатуры строку,
 * состоящую из латинских букв, пробелов и знаков препинания:
 * '.', ',', '!', '?', ':', ';' и выводит на экран данную строку,
 * в которой: если между двумя словами нет знака препинания,
 * то они разделяются ровно одним пробелом, если знак препинания
 * присутствует, то перед ним пробела не ставится, а после
 * него - ставится, если подряд идут несколько знаков препинания,
 * они могут разделяться 0 или 1 пробелами. */

#include <stdio.h>

void main( void )
{
  char str[80];
  int i, neword;

  printf("Введите строку символов (не более 80) >\n");
  gets(str);

  i = 0;
  neword = 1;
  /* Проходим все символы */
  while (str[i])
  {
    /* Пробел - разделитель слов, пока пробел не выводим */
    if (str[i] == ' ')
      neword = 1;
    /* Знак препинания - резделитель, выводим его */
    else
      if ((str[i] == '.') || (str[i] == ',') || (str[i] == '!') ||
          (str[i] == '?') || (str[i] == ':') || (str[i] == ';'))
      {
        printf("%c", str[i]);
        neword = 1;
      }
      /* Если начинается новое слово, и это не первое слово -
       * выводим перед ним пробел */
      else
      {
        if (neword && i)
          printf(" ");
        printf("%c", str[i]);
        neword = 0;
      }
    i ++;
  }
} /* End of 'main' function */

/* End of 'task_1_16.c' file */
Файл в кодировке MS-DOS
27 ноября 2003 года   Огурцов Е.В.