Подтвердить что ты не робот

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

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

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

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

Выход

> 1234
got the number: 1
4b9b3361

Ответ 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);

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

Ответ 2

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

int input_value;

scanf("%d", &input_value);

Однако в большинстве случаев вы хотите проверить, была ли ваша попытка чтения ввода успешной. scanf возвращает количество элементов, которые он успешно преобразовал, поэтому обычно вы хотите сравнить возвращаемое значение с количеством элементов, которые вы ожидали прочитать. В этом случае вы ожидаете прочитать один элемент, поэтому:

if (scanf("%d", &input_value) == 1)
    // it succeeded
else
    // it failed

Конечно, то же самое относится ко всему семейству scanf (sscanf, fscanf и т.д.).

Ответ 3

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