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.)
Pourquoi avez-vous (* tmp && isspace (* tmp)) dans la boucle while? Je comprends pourquoi vous avez l'isspace, mais pas le premier tmp. Merci! – Crystal
@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. –
@Michael: mais '\ 0' n'est pas un caractère espace, ce test est donc inutile. – unwind