Ваш код имеет некоторые проблемы:
В большинстве случаев вы не хотите делать проверку feof(fp)
в верхней части цикла при чтении файла. Почти гарантировано, что если вы сделаете это, вы прочитаете последнюю строку файла дважды . Это связано с тем, что feof()
возвращает true только в том случае, если ранее попытка чтения привела к «концу файла». Лучший способ - проверить, возвращает ли fgets()
NULL
:
while (fgets(str, LINE_SIZE, fp) != NULL) {
/* do your processing */
}
if (ferror(fp)) { /* there was an error reading some data */ }
Ваш isspace()
вызов должен привести *str
к unsigned char
, если он не относится к этому типу:
while (isspace((unsigned char)(*str))) {
Чтобы использовать isspace()
, вам необходимо #include <ctype.h>
.
Вам нужно увеличить str
. Ваше выражение str+1
оценивает str+1
, отбрасывает его значение и ничего не делает. Итак, вам нужно:
++str;
Но вы не хотите увеличивать str
: вам это нужно для следующего fgets()
вызова. Итак, вы должны скопировать его во временный указатель:
char *tmp = str;
while (isspace((unsigned char)(*tmp))) {
++tmp;
}
После внесения всех вышеуказанных изменений ваш цикл становится:
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);
}
}
(У вас есть дополнительное закрытие }
, скорее всего, ошибка копирования-вставки.)