Почему scanf не работает с пробелами в конце формального ввода? - PullRequest
1 голос
/ 10 ноября 2019

Я пытаюсь это:

    int M,N,K;
    printf("Enter (m,k,n) : ");
    scanf("%d %d %d ", &M, &K, &N);
    printf("\nDone?");

Это внутри основной функции. Мне нужна программа для чтения трех целых чисел, но когда я ее запускаю, она просто читает три, но не проходит мимо scanf, то есть "Готово?"не выполняется, как будто он все еще ждет большего ввода. Если я удаляю пробел после последнего% d, он работает нормально. Но почему это так?

Ответы [ 3 ]

4 голосов
/ 10 ноября 2019

Если я удаляю пробел после последнего% d, он работает нормально. Но почему это так?

" " в "%d %d %d " указывает scanf() читать, а не сохранять любое количество пробелов, включая '\n'.

scanf() продолжает потреблять пробелы до тех пор, пока не встретятся не-пробелы. @ user3121023

"%d %d %d " обязывает scanf() не возвращаться до тех пор, пока не будет прочитано некоторое не-пробел после 3 цифр.


Совет: избегайте scanf(). Используйте fgets(), а затем проанализируйте строку . @ DevSolar

0 голосов
/ 10 ноября 2019

Попробуйте прочитать значения отдельно. Я не думаю, что scanf предназначен для такого использования. Кроме того, что вы ожидаете поставить пробел в конце строки scanf? Попробуйте это:

scanf("%d", &M);
scanf("%d", &K);
scanf("%d", &N);

РЕДАКТИРОВАТЬ: Я проверил это, и да, вы можете сделать это. Но почему вы хотели бы сделать это? Будет сложнее проверить, если введенные пользователем данные неверны, например, с пустым пространством или непреднамеренным символом. Вы можете прочитать это как полную строку с fgets() и маркировать ее с strtok(), если вы ожидаете всего в одной текстовой строке. Или просто прочитайте значения отдельно, как показано.

Ну, просто мое мнение, хотя. Если я ошибаюсь, пожалуйста, кто-нибудь разъяснит мне.

0 голосов
/ 10 ноября 2019

Вот способ принять пользовательский ввод в нескольких переменных:

int M,N,K;
printf("Enter (m,k,n) : ");
scanf("%d", &M);
scanf("%d", &N);
scanf("%d", &K);
printf("\nDone?");
...