Чтобы прямо ответить, почему 3-й и все остальные сканы «пропускаются», так работает формат scanf()
и %c
.Когда есть звонок на scanf()
, вам обычно нужно нажать ввод, чтобы «отправить» ввод.Следовательно, это вставляет символ новой строки в поток stdin
.
Когда было введено предыдущее сканирование с плавающей запятой, новая строка все еще остается в потоке.Когда сканирование символа достигнуто, этот оставшийся символ новой строки считывается, поскольку он эффективно «пропускает» вызов.
Вы должны использовать fgets()
с sscanf()
, как подсказывает кодаддикт.
Но для быстрого исправления вы можете попробовать добавить вызов к getchar()
после сканирования с плавающей запятой, чтобы использовать этот символ новой строки из потока.
edit:
Вы говорите, что это не работает?(при условии, что вы вводите правильные виды значений, по одному на каждый вызов scanf)
main()
{
char c[5];
float q[5];
int i;
for(i=0;i<5;i++)
{
printf("\n%d ",i);
scanf("%c",c+i);
scanf("%f",q+i);
getchar();
}
}