2010-03-27 4 views
1

J'ai quelques entrées comme ceci:Décapage espaces vides et les nouvelles lignes de chaînes en C

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

et je dois désinfectez comme ceci:

"aaaaa bbb cccccc ddddd neeee" 

En gros:

  • Couper tous les espaces vides au début et à la fin de la chaîne
  • Dénuder toutes les nouvelles lignes
  • Strip tous les espaces quand il y a plus d'un, mais toujours en laisser un espace entre les mots

est-il un moyen facile de faire ceci ou je vais devoir traiter la chaîne, char par char et copiez le caractères appropriés à une variable différente?

+0

Puisque vous êtes seulement en supprimant les caractères (jamais ajoutant), vous pouvez faire la copie en place (2 pointeurs dans la même chaîne). –

+1

Je ne comprends pas ce que vous voulez dire ... –

Répondre

3

En supposant que vous ne pouvez pas modifier la chaîne en place,

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

En fait, ma question était de savoir s'il y avait une meilleure façon que de faire juste ce lol. Mais j'apprécie le code, c'est plus simple que ce que je pensais. –

+0

J'ai appliqué le code aujourd'hui et juste pour faire savoir aux autres que le dernier moment (pour consommer tous les espaces) c'est manger la première lettre de chaque mot. J'ai corrigé cela en incrémentant 's' dans la boucle. –

0

Vous pouvez utiliser strtok pour marquer lexicalement la chaîne, délimiter avec "\ r \ n \ t". Cela facilitera votre travail.

+4

En fait, je pense (personnellement) qu'une boucle manuscrite serait plus facile. strtok est l'un de ces mésaventures * laid :-) – paxdiablo

Questions connexes