2017-06-07 4 views
0

En étant donné une ligne qui existe dans le tableau. Comme dans ce cas:Dans une ligne de certains fichiers (ou stdin), comment puis-je réduire les espaces supplémentaires et convertir les onglets en espace unique?

char line[50]; 
while (fgets(line,50, input_file) != NULL) { 
// how can i do it here.. 
} 

Comment puis-je réduire tous les espaces supplémentaires à l'espace unique, et de réduire tous les onglets (entre deux mots) à un seul espace.

Par exemple:
En donner cette ligne:

a b abb  ace ab 

Il est nécessaire d'être:

a b abb ace ab 
+0

Qu'avez-vous essayé? Le petit code que vous avez posté a une erreur de syntaxe. –

+0

Je l'ai édité. maintenant c'est bon? – StackUser

+0

En général, j'ai essayé d'utiliser 'strtok', mais je n'ai pas réussi à obtenir une solution finale à ce problème. – StackUser

Répondre

1

comme ceci:

#include <stdio.h> 

char *reduce_and_trim(char *s); 

int main(void) { 
    FILE *input_file = stdin; 
    char line[50]; 
    while (fgets(line,50, input_file) != NULL) { 
     printf("'%s'\n", reduce_and_trim(line)); 
    } 
    fclose(input_file); 
} 

#include <string.h> 

char *reduce_and_trim(char *s){ 
    static const char *whitespaces = " \t\n";//\t:tab, \n:newline, omit \f\r\v 
    size_t src = strspn(s, whitespaces);//Trim of the beginning 
    size_t des = 0;//destination 
    size_t spc = 0;//number of whitespaces 

    while(s[src] != '\0'){ 
     if((spc = strspn(s+src, whitespaces)) != 0){ 
      src += spc; 
      s[des++] = ' ';//reduce spaces 
     } else { 
      s[des++] = s[src++]; 
     } 
    } 
    if(des && s[des-1] == ' ') 
     s[des-1] = 0;//Trim of end 
    else 
     s[des] = 0; 

    return s; 
} 
+0

[DEMO] (http://ideone.com/0FcuNP) – BLUEPIXY

1

Voici une solution simple :

char line[50]; 
while (fgets(line, sizeof line, input_file) != NULL) { 
    size_t i, j; 
    for (i = j = 0; line[i] != '\0'; i++) { 
     if (isspace((unsigned char)line[i])) { 
      while (isspace((unsigned char)line[++i])) 
       continue; 
      if (line[i] == '\0') 
       break; 
      if (j != 0) 
       line[j++] = ' '; 
     } 
     line[j++] = line[i]; 
    } 
    line[j] = '\0'; 
    printf("reduced input: |%s|\n", line); 
} 

Maintenant, puisque c'est des devoirs, voici quelques questions supplémentaires pour répondre:

  • qui comprennent les fichiers sont nécessaires?
  • Pourquoi la distribution (unsigned char)line[i] est-elle nécessaire?
  • que se passera-t-il si une ligne de plus de 50 octets est lue à partir de input_file?
  • Quel est le problème avec la question précédente?
+0

@BLUEPIXY: merci! garçon, tes yeux sont vifs! – chqrlie