Как получить int из stdio в C? - PullRequest
       57

Как получить int из stdio в C?

23 голосов
/ 23 февраля 2011

Возникли значительные проблемы с этим ...

printf("> ");
int x = getchar();

printf("got the number: %d", scanf("%d", &x));

output

> 1234
got the number: 1

Ответы [ 3 ]

48 голосов
/ 23 февраля 2011

Я не совсем уверен, что это то, что вы ищете, но если ваш вопрос заключается в том, как прочитать целое число, используя <stdio.h>, то правильный синтаксис:

int myInt;
scanf("%d", &myInt);

Вам, конечно, потребуется много обработать ошибки, чтобы убедиться, что это работает правильно, но это должно быть хорошим началом. В частности, вам нужно будет обработать случаи, когда

  1. Файл stdin закрыт или сломан, поэтому вы ничего не получите.
  2. Пользователь вводит что-то недопустимое.

Чтобы проверить это, вы можете получить код возврата из 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);

Надеюсь, это поможет!

6 голосов
/ 23 февраля 2011

Типичный способ с scanf:

int input_value;

scanf("%d", &input_value);
2 голосов
/ 18 октября 2013

Решение довольно простое ... вы читаете 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
...