2010-01-29 2 views
1

J'utilise la fonction fgets pour lire une ligne à partir d'un fichier. Je ne comprends pas comment ignorer l'espace blanc principal d'un fichier. Je pensais que si j'avais un tableau char, je pourrais vérifier la première valeur pour voir si c'est un espace avec isspace, puis incrémenter à la valeur suivante. Mon code ressemble à:Ignorer les espaces de début avec un tableau de caractères dans C

while (!feof(fp)) { 
     fgets(str, LINE_SIZE, fp); 
     while (isspace(*str)) {  // need help 
      str + 1;  // here 
     } 


     for (cp = str; cp = strtok(cp, "AEIOUaeiou\n"); cp = NULL) { 
      puts(cp); 
     } 
    } 
} 

Merci!

Répondre

4

ce que vous voulez est quelque chose comme

while (!feof(fp)) { 
     fgets(str, LINE_SIZE, fp); 
     char * tmp = str; //use a temporary variable so str pointer isn't overwritten 
     while (*tmp && isspace(*tmp)) {  // need help 
      tmp++;  // here 
     } 


     for (cp = tmp; cp = strtok(cp, "AEIOUaeiou\n"); cp = NULL) { 
      puts(cp); 
     } 
    } 
} 
+0

Pourquoi avez-vous (* tmp && isspace (* tmp)) dans la boucle while? Je comprends pourquoi vous avez l'isspace, mais pas le premier tmp. Merci! – Crystal

+0

@Crystal: si 'tmp' est tous des espaces, alors la boucle arrivera à la fin de la chaîne - le test de' * tmp' termine la boucle quand elle atteint ce point au lieu de dépasser la fin dans la mémoire indéfinie. –

+0

@Michael: mais '\ 0' n'est pas un caractère espace, ce test est donc inutile. – unwind

0

Vous devez utiliser

str = str+1; 

qui peut être à écourter

str += 1; 

ou mieux encore

++ str; 

dans // here pour mettre à jour le pointeur str.

1

la valeur de str n'a pas été modifiée. essayez de changer

str+1; 

à

str++; 
0

Votre code a quelques problèmes:

La plupart du temps, vous ne vouloir faire le contrôle feof(fp) en haut d'une boucle lors de la lecture d'un fichier. Il est presque garanti que si vous le faites, vous aurez read the last line of the file twice. Cela est dû au fait que feof() renvoie true uniquement si une tentative de lecture antérieure a abouti à la fin du fichier. Une meilleure méthode consiste à vérifier si fgets() retours NULL:

while (fgets(str, LINE_SIZE, fp) != NULL) { 
    /* do your processing */ 
} 
if (ferror(fp)) { /* there was an error reading some data */ } 

Votre isspace() appel devrait jeter *str à unsigned char si ce n'est pas de ce type:

while (isspace((unsigned char)(*str))) { 

Pour utiliser isspace(), vous devriez #include <ctype.h> .


Vous devez incrémenter str. Votre expression str+1 évalue str+1, ignore sa valeur et ne fait rien. Donc, vous avez besoin:

++str; 

Mais vous ne voulez pas augmenter str: vous avez besoin que pour le prochain appel fgets().Donc, vous devez copier à un pointeur temporaire:

char *tmp = str; 
while (isspace((unsigned char)(*tmp))) { 
    ++tmp; 
} 

Faire tous les changements ci-dessus, votre boucle devient:

while (fgets(str, LINE_SIZE, fp) != NULL) { 
    char *tmp = str; 
    while (isspace((unsigned char)(*tmp))) 
     ++tmp; 

    for (cp = tmp; cp = strtok(cp, "AEIOUaeiou\n"); cp = NULL) { 
     puts(cp); 
    } 
} 

(Vous avez une fermeture supplémentaire }, très probablement une copie -passe erreur.)

0

Pour ajouter à Kenny et Piere puisqu'ils ont mentionné str++ et ++str, la différence entre les deux est quelle version de str sera utilisé dans l'expression.

Par exemple

int y=1; 
x[y++]=10;  //1 
and x[++y]=10; //2 

dans //1 index 1 est utilisé et est affecté x[1] 10 et après que y is 2 et dans //2x[2]=10 ce qui signifie que Y a été incrémenté avant qu'elle ne soit utilisée comme un index. En général, vous souhaitez utiliser ++value partout. Cependant, comme je l'ai illustré value++ a ses utilisations.

Questions connexes