Почему второй scanf() не выполняет
Я пытаюсь выполнить этот блок кода.
#include <stdio.h>
int main(void)
{
printf("Start from here\n");
int e, f, g, h;
scanf("%d,%d", &e, &f);
scanf("%d, %d", &g, &h);
printf("%d %d %d %d", e, f, g, h);
}
Когда я ввожу 2,0
или что-то, что соответствует строке формата в первом scanf()
, также выполняется вторая scanf()
.
Однако, если я ввожу что-то вроде 2-0
в первый scanf()
, программа пропускает второй scanf()
и переходит прямо к printf()
Например, здесь ввод и вывод пробного запуска программы. Вторая строка - это вход.
Start from here
1-2
1 0 -2 -856016624u
Обратите внимание, как программа полностью пропустила второй scanf()
и сразу же перешла к printf()
. Почему здесь пропущен второй scanf()
?
Ответы
Ответ 1
scanf
строка формата заботится о неформатных спецификаторах в нем тоже. Когда вы пишете "1-2", первый scanf будет читать "1", а затем ищет запятую. Он не найдет никого, поэтому он сдастся. Теперь второй scanf увидит "-2", а затем ищет запятую. Он не найдет никого, поэтому он сдастся.
Конечный результат состоит в том, что две другие переменные не будут установлены, поэтому они будут в конечном итоге быть любым мусором в своей ячейке памяти во время выполнения.
Вы можете избежать этого, проверив возвращаемое значение scanf. Он расскажет вам, сколько значений оно обнаружило. Попробуйте следующее:
#include <stdio.h>
int main(void)
{
printf("Start from here\n");
int e, f, g, h;
if (scanf("%d,%d", &e, &f) != 2) { /* error handling */ }
if (scanf("%d, %d", &g, &h) != 2) { /* error handling */ }
printf("%d %d %d %d", e, f, g, h);
}
Ответ 2
Удалите запятую между двумя спецификаторами формата.
scanf("%d %d", &e, &f); // Remove comma in first argument of scanf
scanf("%d %d", &g, &h); // Remove comma in first argument of scanf
^^^
Remove comma between two numbers
Потому что scanf
пропускает только пробел, а comma
не пробел.
Что на самом деле происходит, когда вы спрашиваете scanf
читать числовые данные, так это то, что он сначала пропускает любое свободное пространство, которое он находит, а затем он читает символы, пока символ, который он читает, не может быть частью числа.
В этом случае, когда он встречает запятую, он перестает читать. Так как он не читал никаких цифр, для его хранения нет номера, поэтому он просто оставляет исходное значение.
Ответ 3
В вашем коде scanf("%d, %d",&e,&f)
будет таким образом, поэтому вы должны указать свой ввод, например: 1,2
или 2,3
и т.д.
Если вы хотите, чтобы ваш ввод был задан как 0-2
или 2-4
, тогда ваш scanf должен выглядеть примерно так: scanf("%d-%d",&e,&f)
.
Таким образом, он не будет пропущен.