2017-01-01 11 views
-2

Что именно произойдет, если я делаю следующееЗапятая между двумя целыми числами при входе

scanf("%d,%d", &i, &j); 

и обеспечивают ввод, который вызывает сбой согласования? Будет ли он хранить мусор в j?

+3

Что вы вводите? –

+0

Похоже на дублирование: http://stackoverflow.com/questions/15091284/read-comma-separated-input-with-scanf –

+3

[почему бы не прочитать страницу руководства] (https://linux.die.net/ man/3/scanf) –

ответ

5

входа должен точно соответствует прилагаемым формату для scanf() быть успешным.

Цитирование C11, глава §7.21.6.2, fsacnf() (курсив мой)

За исключением случая % спецификатор элемента ввода (или, в случае %n директивы, количество входных символов) преобразуется в тип, соответствующий спецификатору преобразования. Если входной элемент не соответствует последовательности, выполнение директивы не выполняется: это условие является несоответствующим. Если подавление присваивания не было указано *, результат преобразования помещается в объект, на который указывает первый аргумент, следующий за аргументом формата, который еще не получил результат преобразования. Если этот объект не имеет соответствующего типа, или если результат преобразования не может быть представлен в объекте, поведение не определено.

и

Когда все директивы были выполнены, или если директива не удается (как описано ниже), функция возвращает.

Таким образом, закрепление выше случаев,

  • Для входа как 100, 200, сканирование будет успех. Оба значения i и j будут удерживать заданные значения, 100 и 200 соответственно.

  • Для входа как 100 - 200, сканирование произойдет сбой (соответствующий отказ) и содержание j будет оставаться неизменной, то есть, j не назначается любое значение от scanf() операции.

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