void f(void) {
char s[100] = {0} ;
scanf("%[^\n]s", s);
printf("1: %s\n", s);
scanf("%[^\n]s", s);
printf("2: %s\n", s);
scanf("%[^\n]s", s);
printf("3: %s\n", s);
}
ab cd ef gh
1: ab cd ef gh
2: ab cd ef gh
3: ab cd ef gh
Верно ли я понимаю, что первый scanf читает поток и останавливается на \n , после чего каждый последующий вызов scanf начинает чтение с этого же символа (\n) и, следовательно, моментально останавливается
%[^\n]s
содержит символ s
который никогда не заматчится, потому что %[^\n]
останавливается на символе '\n'. Логично было бы заменить её на %[^\n]%*c
чтобы работало так, как было задумано.