Можете объяснить как работает цикл

#include <stdio.h>
#include <string.h>
#define N 256
#define DELIM " \n\t,.;:?!"
int main()
{
    int i;
    char D[]="eEyYuUiIoOaA";
    char str[N], *p;
    puts("Enter line:");
    fgets(str, N, stdin);
    for(p = strtok(str, DELIM); p; p = strtok(NULL, DELIM)){
        for(i = 0; D[i]; i++){
            if (*p == D[i] ){
                puts(p);
                break;
            }
        }
    }
    return 0;
}

Ответы (1 шт):

Автор решения: Сабир Исламов

Я не программирую на С, но попробую объяснить :)

Здесь мы получаем указатель на следующую лексему (изначальная строка str делиться на подстроки по разделителю DELIM),

p = strtok(str, DELIM)

при этом значение переменно p будет равно NULL, если следующая лексема не найдена, по этому эта переменная без всякого оператора стоит у блоке условия выхода цикла

и так же для получения следующей обрабатываемой лексемы из строки нужно вызвать эту же функцию, но с NULL в качестве первого аргумента

В итоге мы получаем в этой строке for(p = strtok(str, DELIM); p; p = strtok(NULL, DELIM)){ следующий смысл: получить лексему из строки по нужному разделителю, обработать внутри цикла; выйти из цикла если лексема не получена; на следующей итерации получить следующую лексему или выйти, если лексем больше нет.

Ну а внутри вложенного цикла

 for(i = 0; D[i]; i++){
            if (*p == D[i] ){
                puts(p);
                break;
            }
        }

Мы просто проходим по всем символам массива D и сравниваем их с текущей лексемой, и если они совпадают, то добавляем в какую-то структуру текущую лексему и прервать внутренний цикл.

→ Ссылка