scanf () оставляет новый символ строки в буфере

у меня есть следующие программы:

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. Это правильно?

3 ответов


на scanf() функция автоматически удаляет пробелы перед попыткой проанализировать преобразования, отличные от символов. Форматы символов (в первую очередь %c; также сканировать наборы %[…] и %n) являются исключением; они не удалить пробелы.

использовать " %c" с ведущим пробелом, чтобы пропустить дополнительный пробел. Не используйте конечный пробел в scanf() строковый формат.

обратите внимание, что это по-прежнему не потребляет никаких конечных пробелов оставлено во входном потоке, даже не до конца строки, поэтому остерегайтесь этого, если также используете getchar() или fgets() на том же входном потоке. Мы просто заставляем scanf пропустить пробелы до преобразования, как это делает %d и другие преобразования без символов.


обратите внимание, что не пробелы " директивы "(использовать POSIX scanf терминология) кроме преобразования, как буквальный текст в scanf("order = %d", &order); также не пропускает пробелы. Буквальное order должен соответствовать следующему символу для чтения.

так что вы, вероятно, хотите " order = %d" там, если вы хотите пропустить новую строку из предыдущей строки, но по-прежнему требуют буквального соответствия на фиксированной строке, такой вопрос.


использовать scanf(" %c", &c2);. Это решит вашу проблему.


использовать getchar() перед вызовом second scanf().

scanf("%c", &c1);
getchar();  // <== remove newline
scanf("%c", &c2);