Почему второй 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).

Таким образом, он не будет пропущен.