2010-03-27 5 views
1

У меня есть некоторый вклад как это:Зачистка пробелы и переводы строк из строк в C

" aaaaa  bbb \n cccccc\n ddddd \neeee " 

И мне нужно, чтобы дезинфицировать это так:

"aaaaa bbb cccccc ddddd neeee" 

В основном:

  • Обрезать все пробелы в начале и конце строки
  • Стриптиз всех новых строк
  • вырежет все пространства, когда есть больше чем один, но всегда оставляют один пробел между словами

Есть ли простой способ сделать это, или я должен обработать строку, символ на гольца и скопировать соответствующие символы для другой переменной?

+0

Поскольку вы только удаление символов (никогда не добавляющие), вы можете сделать копию на месте (2 указатели на ту же строку). –

+1

Я не понимаю, что вы имеете в виду ... –

ответ

3

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

void splcpy(char *s, char *m){ //s is the unmodified string 
    int word = -1; //keeps track what was stored in last loop 
    while(*s){ //until it ends 
    if(!isspace(*s)){ 
     if(word==0) *m++ = ' '; //if last char was space, add space 
     *m++ = *s++; 
     word = 1; 
    } 
    else{ 
     if(word == 1) word = 0; //if last char was !space 
     while(isspace(*s++)); //consume all space until end 
    } 
    } 
    *m = '\0'; //end the string nicely 
} 

char *input = " aaaaa  bbb \n cccccc\n ddddd \neeee "; 
char *modified = malloc(sizeof(char) * strlen(input)); 

splcpy(input, modified); 
+0

На самом деле мой вопрос был, если был лучший способ, чем делать только этот lol. Но я ценю код, это проще, чем то, о чем я думал. –

+0

Я применил код сегодня и просто чтобы другие знали, что последнее время (для того, чтобы потреблять все пробелы), он употребляет первую букву каждого слова. Я исправил это, увеличив 's' внутри цикла. –

0

Вы можете использовать strtok для лексической маркировки строки, разделите ее на "\ r \ n \ t". Это упростит вашу работу.

+4

Собственно, я (лично) считаю, что рукописный цикл будет проще. strtok является одним из тех * уродливых * misfeatures :-) – paxdiablo