Замена нескольких пробелов и табуляций одни пробелом

/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .c.geshi_code {font-family:monospace;} .c.geshi_code .imp {font-weight: bold; color: red;} .c.geshi_code .kw1 {color: #b1b100;} .c.geshi_code .kw2 {color: #000000; font-weight: bold;} .c.geshi_code .kw3 {color: #000066;} .c.geshi_code .kw4 {color: #993333;} .c.geshi_code .co1 {color: #666666; font-style: italic;} .c.geshi_code .co2 {color: #339933;} .c.geshi_code .coMULTI {color: #808080; font-style: italic;} .c.geshi_code .es0 {color: #000099; font-weight: bold;} .c.geshi_code .es1 {color: #000099; font-weight: bold;} .c.geshi_code .es2 {color: #660099; font-weight: bold;} .c.geshi_code .es3 {color: #660099; font-weight: bold;} .c.geshi_code .es4 {color: #660099; font-weight: bold;} .c.geshi_code .es5 {color: #006699; font-weight: bold;} .c.geshi_code .br0 {color: #009900;} .c.geshi_code .sy0 {color: #339933;} .c.geshi_code .st0 {color: #ff0000;} .c.geshi_code .nu0 {color: #0000dd;} .c.geshi_code .nu6 {color: #208080;} .c.geshi_code .nu8 {color: #208080;} .c.geshi_code .nu12 {color: #208080;} .c.geshi_code .nu16 {color:#800080;} .c.geshi_code .nu17 {color:#800080;} .c.geshi_code .nu18 {color:#800080;} .c.geshi_code .nu19 {color:#800080;} .c.geshi_code .me1 {color: #202020;} .c.geshi_code .me2 {color: #202020;} .c.geshi_code span.xtra { display:block; }


 

Здравствуйте.
Суть проста - нужно удалять все подрядстоящие комбинации из пробелов и табуляций и заменять их на один пробел.
Да, если кто-то узнал, это онда из самых начальных задач из Кернигана и Ритчи, но вот меня на ней заклинило.
И, если можно, много n тоже заменить на один.
Спасибо.

1 ответов


Исходя из вашего описания задания, код может выглядеть как-то так (подряд идущие переводы строк я заменял на 1 перенос):


char text[] = "some text\t\t  more text \n \t op op  \n\n\n\nend.";
int length = strlen(text);
printf("Old text:\n%s\n", text);

int k = 1;
for(int i=1; i<length; i++)
{
  //если встречаем перевод строки
  if(text[i] == '\n')
  {
    //проверяем, что перед этим у нас не было перевода строки
    if(text[k-1] != '\n')
    {
      //и только тогда пишем перевод строки
      text[k] = '\n';
      k++;
    }
  }
  else
  {
    //если встречаем пробел или таб
    if(text[i] == ' ' || text[i] == '\t')
    {
      //проверяем, что перед этим у нас не было пробела
      if(text[k-1] != ' ')
      {
        //и только тогда пишем пробел
        text[k] = ' ';
        k++;
      }
    }
    else
    {
      //сюда попадаем, когда у нас символ не является пробелом, табом или переносом строки
      text[k] = text[i];
      k++;
    }
  }
}

//не забываем поставить новый конец строки
text[k] = '\0';

printf("New text:\n%s\n", text);
 Не знаю, нужно ли было обходиться без лишних переменных, я решил обойтись :Р


s/[\s|\t]+/ /g;