Вопрос про спецсимволы scanf
Возник вопрос касательно scanf в следующем задании (код на языке C): Передать информацию обо всех активных процессах в системе через межпроцессный канал в параллельный процесс и вывести в нем идентификаторы всех процессов.
В дочернем процессе я пишу строчку execl("/usr/bin/ps", "ps", "axl", NULL);
(по желанию преподавателя это именно ps axl - если эту команду записать в командной строке, то идентификатор процесса (PID) будет являться третьим столбцом по счёту слева), далее, как сказал преподаватель, в родительском процессе надо извлекать из каждой строки идентификатор (перед этим я, безусловно, перенаправила стандартный ввод на файловый дескриптор отца для считывания). Я попробовала реализовать это разными способами: использовать утилиту awk, записав её в system (чтоб извлечь из межпроцессного канала третий столбец); использовать getline - эти 2 способа корректно работают, но оказалось, что необходимо также попробовать реализовать через scanf и спецсимволы. Поискав в Интернете, я нашла способ реализации для извлечения третьего столбца:
scanf("%*[^\n]\n"); // пропускаем первую строчку, где записаны названия столбцов
int ourPID;
while (scanf("%*s %*s %d %*[^\n]\n", &ourPID) == 1) {
printf("%d\n", ourPID);
}
Разбираясь в использовании спецсимволов в scanf возник вопрос насчёт использования \n в конце scanf - если я верно понимаю, выражение %*[^\n] в scanf в условии while означает следующее: игнорирование оставшейся части строки до символа \n (поправьте, пожалуйста, если не права). Но не очень понимаю, необходимо ли тут записывать \n после упомянутого выражения, если программа корректно работает и с ним, и без него? Разве без указания \n scanf не перейдёт сам на следующую строку для считывания? Или наличие \n тут необходимо по какой-либо причине?
Я пыталась разобраться на примитивных примерах с помощью сравнения двух scanf:
int number;
scanf("%d", &number);// сравнивать со следующей строкой
//scanf("%d\n", &number);
printf("%d", number);
Программа действительно работает по-разному в данном случае (хотя, наверное, грамотно не смогу объяснить, почему так, но интуитивно кажется понятным), но в первом, выше описанном случае, не совсем понимаю разницу между написанным выше и тем же самым, но если убрать \n в конце scanf.