Имея значительные проблемы с этим...
printf("> ");
int x = getchar();
printf("got the number: %d", scanf("%d", &x));
Выход
> 1234
got the number: 1
Имея значительные проблемы с этим...
printf("> ");
int x = getchar();
printf("got the number: %d", scanf("%d", &x));
> 1234
got the number: 1
Я не совсем уверен, что это то, что вы ищете, но если ваш вопрос заключается в том, как читать целое число с помощью <stdio.h>
, то правильный синтаксис
int myInt;
scanf("%d", &myInt);
Вам нужно будет сделать много ошибок, чтобы гарантировать, что это работает правильно, конечно, но это должно быть хорошим началом. В частности, вам нужно будет обрабатывать случаи, когда
stdin
закрыт или сломан, поэтому вы ничего не получаете.Чтобы проверить это, вы можете записать код возврата из scanf
следующим образом:
int result = scanf("%d", &myInt);
Если stdin
обнаруживает ошибку при чтении, result
будет EOF
, и вы можете проверить наличие таких ошибок:
int myInt;
int result = scanf("%d", &myInt);
if (result == EOF) {
/* ... you're not going to get any input ... */
}
Если, с другой стороны, пользователь вводит что-то недействительное, например, текстовую строку мусора, то вам нужно прочитать символы из stdin
, пока вы не будете уничтожать все нарушающие входные данные. Вы можете сделать это следующим образом, используя тот факт, что scanf
возвращает 0, если ничего не было прочитано:
int myInt;
int result = scanf("%d", &myInt);
if (result == EOF) {
/* ... you're not going to get any input ... */
}
if (result == 0) {
while (fgetc(stdin) != '\n') // Read until a newline is found
;
}
Надеюсь, это поможет!
РЕДАКТИРОВАТЬ. В ответ на более подробный вопрос, вот более подходящий ответ.: -)
Проблема с этим кодом заключается в том, что когда вы пишете
printf("got the number: %d", scanf("%d", &x));
Это печатает код возврата из scanf
, который является EOF
при ошибке потока, 0
, если ничего не было прочитано, и 1
в противном случае. Это означает, что, в частности, если вы введете целое число, это всегда будет печатать 1
, потому что вы печатаете код состояния из scanf
, а не номер, который вы читаете.
Чтобы исправить это, измените это на
int x;
scanf("%d", &x);
/* ... error checking as above ... */
printf("got the number: %d", x);
Надеюсь, это поможет!
Типичный способ с scanf
:
int input_value;
scanf("%d", &input_value);
Однако в большинстве случаев вы хотите проверить, была ли ваша попытка чтения ввода успешной. scanf
возвращает количество элементов, которые он успешно преобразовал, поэтому обычно вы хотите сравнить возвращаемое значение с количеством элементов, которые вы ожидали прочитать. В этом случае вы ожидаете прочитать один элемент, поэтому:
if (scanf("%d", &input_value) == 1)
// it succeeded
else
// it failed
Конечно, то же самое относится ко всему семейству scanf
(sscanf
, fscanf
и т.д.).
Решение довольно простое... вы читаете getchar(), который дает вам первый символ во входном буфере, а scanf просто разбирает его (действительно не знаю почему) до целого числа, если вы просто забудете getchar на секунду, он будет читать полный буфер до новой строки char.
printf("> ");
int x;
scanf("%d", &x);
printf("got the number: %d", x);
> [prompt expecting input, lets write:] 1234 [Enter]
got the number: 1234