У меня есть следующая программа:
int main(int argc, char *argv[])
{
int a, b;
char c1, c2;
printf("Enter something: ");
scanf("%d",&a); // line 1
printf("Enter other something: ");
scanf("%d", &b); // line 2
printf("Enter a char: ");
scanf("%c",&c1); // line 3
printf("Enter another char: ");
scanf("%c", &c2); // line 4
printf("Done"); // line 5
system("PAUSE");
return 0;
}
Как я читал в книге C, автор говорит, что scanf()оставил символ новой строки в буфере, поэтому программа не останавливается на строке 4, чтобы пользователь мог ввести данные, а сохраняет символ новой строки в c2 и переходит к строке 5.
Это правильно?
Однако происходит ли это только с charтипами данных? Потому что я не видел этой проблемы с intтипами данных как в строке 1, 2, 3. Это правильно?
Решение проблемы
Функция scanf()автоматически пропускает начальные пробелы перед попыткой анализа преобразований, отличных от символов. Исключением являются форматы символов (в первую очередь %c; также наборы сканов %[…]— и ); %nони не пропускают пробелы.
Используйте " %c"с начальным пробелом, чтобы пропустить необязательный пробел. Не используйте завершающий пробел в scanf()строке формата.
Обратите внимание, что это по-прежнему не использует какие-либо конечные пробелы, оставшиеся во входном потоке, даже до конца строки, поэтому остерегайтесь этого, если также используете getchar()или fgets()в том же входном потоке. Мы просто заставляем scanf пропускать пробелы перед преобразованиями, как это происходит с for %dи другими несимвольными преобразованиями.
Обратите внимание, что «директивы» без пробелов (используя терминологию POSIX scanf ), отличные от преобразований, например, буквальный текст scanf("order = %d", &order);, также не пропускают пробелы. Литерал orderдолжен соответствовать следующему символу для чтения.
Таким образом, вы, вероятно, захотите " order = %d"этого, если хотите пропустить новую строку из предыдущей строки, но по-прежнему требуете буквального совпадения в фиксированной строке, например, в этом вопросе.
Комментариев нет:
Отправить комментарий