Можете объяснить как работает цикл
#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 и сравниваем их с текущей лексемой, и если они совпадают, то добавляем в какую-то структуру текущую лексему и прервать внутренний цикл.