Требуется сканирование «дополнительный вход»

для некоторого простого кода HW я написал, что мне нужно было получить 7 аргументов через функцию scanf:

scanf("%d %d %d %d\n", &vodka, &country, &life, &glut); scanf("%d\n", &ageof); scanf("%d\n", &dprice); scanf("%d\n", &mprice); 

как вы можете видеть, я прошу 7 аргументов в этом порядке:

аргумент [пробел] аргумент [пробел] аргумент [пробел] (строка вниз)

аргумент (вниз)

аргумент (вниз)

аргумент (вниз)

НО, при запуске кода, мне внезапно потребовалось ввести 8 из них, и я понятия не имею, почему ….

любая помощь кому-нибудь?

Как объяснили @chqrlie и @Blue Moon, пустое пространство в формате, будь то ' ' , '\n' , '\n' или любое белое пространство делает то же самое. Он направляет scanf() на использование белого пробела, например '\n' от Enter , пока не будет обнаружено небелое пространство. Этот символ небелого пробела затем возвращается обратно в stdin для следующей операции ввода.

scanf("%d\n", ...) не возвращается, пока не будет введено некоторое небелое пространство после int . Отсюда необходимость в 8-м входе. Этот 8-й вход не потребляется, но доступен для последующего ввода.


Лучший способ прочитать 4 строки ввода – это … барабанный рулон … читать 4 строки . Затем обработайте входы.

 char buf[4][80]; for (int i=0; i<4; i++) { if (fgets(buf[i], sizeof buf[i], stdin) == NULL) return Fail; } if (sscanf(buf[0], "%d%d%d%d", &vodka, &country, &life, &glut) != 4) { return Fail; } if (sscanf(buf[1], "%d", &ageof) != 1) { return Fail; } if (sscanf(buf[2], "%d", &dprice) != 1) { return Fail; } if (sscanf(buf[3], "%d", &mprice) != 1) { return Fail; } // Use vodka, country, life, glut, ageof, dprice, mprice return Success 

Когда у вас есть пробелы в строке формата, вы скажете scanf() игнорировать любое количество пробельных символов. Таким образом, пространства, которые у вас есть между %d требуют ввода символов без пробелов, которые потребляются для каждого последующего %d .

Эффект пробелов и \n в следующих вызовах scanf (), которые у вас есть, не совсем очевиден. Но символ новой строки в конце каждого последнего scanf() заставляет вас вводить символ без пробелов. Следовательно, похоже, что scanf() требует дополнительного ввода.

Однако на самом деле у вас нет никаких пробельных символов, так как %d всегда игнорирует пробельные символы. Поэтому просто удалите все пробелы и \n символов из строк формата.

Символы пробела в строке формата scanf являются директивами, которые означают пробелы пробела, пока вы не получите символ небелого пробела . Заканчивая \n в вашей форматированной строке, scanf должен использовать листинг строки, который был введен пользователем, и продолжать запрашивать ввод до тех пор, пока не будет замечен символ небелого пробела, но останется во входном буфере.

Чтобы использовать \n точно, вы можете использовать этот уродливый формат scanf :

 scanf("%d%*1[\n]", &mprice); 

Или вы можете просто удалить конечный \ n и использовать символ с помощью getchar() но имейте в виду, что ни один из этих подходов не обеспечивает точное совпадение ввода:

 scanf("%d", &mprice); getchar();