Что именно произойдет, если я делаю следующееЗапятая между двумя целыми числами при входе
scanf("%d,%d", &i, &j);
и обеспечивают ввод, который вызывает сбой согласования? Будет ли он хранить мусор в j
?
Что именно произойдет, если я делаю следующееЗапятая между двумя целыми числами при входе
scanf("%d,%d", &i, &j);
и обеспечивают ввод, который вызывает сбой согласования? Будет ли он хранить мусор в j
?
входа должен точно соответствует прилагаемым формату для scanf()
быть успешным.
Цитирование C11
, глава §7.21.6.2, fsacnf()
(курсив мой)
За исключением случая
%
спецификатор элемента ввода (или, в случае%n
директивы, количество входных символов) преобразуется в тип, соответствующий спецификатору преобразования. Если входной элемент не соответствует последовательности, выполнение директивы не выполняется: это условие является несоответствующим. Если подавление присваивания не было указано*
, результат преобразования помещается в объект, на который указывает первый аргумент, следующий за аргументом формата, который еще не получил результат преобразования. Если этот объект не имеет соответствующего типа, или если результат преобразования не может быть представлен в объекте, поведение не определено.
и
Когда все директивы были выполнены, или если директива не удается (как описано ниже), функция возвращает.
Таким образом, закрепление выше случаев,
Для входа как 100, 200
, сканирование будет успех. Оба значения i
и j
будут удерживать заданные значения, 100
и 200
соответственно.
Для входа как 100 - 200
, сканирование произойдет сбой (соответствующий отказ) и содержание j
будет оставаться неизменной, то есть, j
не назначается любое значение от scanf()
операции.
Слово совет: всегда проверять возвращаемое значение scanf()
функции семьи, чтобы обеспечить успех вызова функции.
Что вы вводите? –
Похоже на дублирование: http://stackoverflow.com/questions/15091284/read-comma-separated-input-with-scanf –
[почему бы не прочитать страницу руководства] (https://linux.die.net/ man/3/scanf) –