Игнорирование начальных пробелов с массивом символов в C - PullRequest
1 голос
/ 29 января 2010

Я использую функцию fgets для чтения строки из файла. Я не понимаю, как игнорировать ведущие пробелы в файле, хотя. Я подумал, что если бы у меня был массив символов, я мог бы проверить первое значение, чтобы увидеть, является ли оно пробелом с isspace, а затем увеличить его до следующего значения. Мой код выглядит так:

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);
        }
    }
}

Спасибо! * * 1004

Ответы [ 5 ]

4 голосов
/ 29 января 2010

то, что вы хотите, это что-то вроде

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);
        }
    }
}
1 голос
/ 29 января 2010

значение str не было изменено. попробуй поменять

str+1;

до

str++;
0 голосов
/ 29 января 2010

Чтобы добавить к Кенни и Пьеру, поскольку они упомянули str++ и ++str, разница между ними заключается в том, какая версия str будет использоваться в выражении.

Например

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

в //1 используется индекс 1 и x[1] назначается 10, а затем y is 2 и //2 x[2]=10, что означает, что y был увеличен до того, как он использовался в качестве индекса.

Как правило, вы хотите использовать ++value везде. Однако, как я показал, value++ имеет свое применение.

0 голосов
/ 29 января 2010

Ваш код имеет некоторые проблемы:

В большинстве случаев вы не хотите делать проверку 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);
    }
}

(У вас есть дополнительное закрытие }, скорее всего, ошибка копирования-вставки.)

0 голосов
/ 29 января 2010

Вы должны использовать

str = str+1;

, которое можно сократить до

str += 1;

или даже лучше

++ str;

в // here для обновления указателя str.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...