Как проверить при сканировании, что вы получаете только целое число (например, 2), а не целое число, за которым следует символ (например, 2c) - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь отсканировать целое число, чтобы проверить, разрешено ли это в моей программе. Однако, если я ввожу число, за которым следует символ, оно все равно будет считаться допустимым числом (я предполагаю, что оно относится только к целому числу при сохранении символа в буфере). Предположим, я могу использовать только scanf, а не что-то еще (поскольку это то, что мы использовали). Кроме того, если я введу только символ, он автоматически преобразуется в целое число. Это то, что я пробовал до сих пор, с помощью того, что я видел здесь -

 int number_of_numbers;
 char number='\n';
 printf("Enter size of input:");
 if (scanf("%d%c",&number_of_numbers, &number)>=1 && number!='\n')
    {
        printf("Invalid size");
        return 0;
    }

Как я могу определить, когда я сканирую только целое число или целое число, за которым следует символ или просто символ? Спасибо!

1 Ответ

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

Если вы введете «только символ», он не «автоматически преобразует его в целое число». Он не принимает вообще никакого ввода , как показывает scanf, возвращая 0, но эта ситуация ускользает от вашего теста.

Но ответ на ваш вопрос: с трудом при использовании scanf.

Вот способ сделать это, получив ввод с помощью fgets. Он будет допускать любое количество пробелов до или после числа, но не любые буквы.

Причина пробела перед %c состоит в том, чтобы дать ему команду отфильтровать любой начальный пробел. В любом случае это автоматически для %d, но не для %c. Тогда, если нет читаемых символов, ничего не будет прочитано в extra. Если есть хотя бы один символ (кроме пробелов), то счетчик конверсии sscanf будет неправильным.

#include <stdio.h>
#include <stdbool.h>

int main(void)
{
    int number_of_numbers = 0;
    while(number_of_numbers >= 0) {
        bool success = false;
        char str[100];
        if(fgets(str, sizeof str, stdin) != NULL) {
            char extra;
            if(sscanf(str, "%d %c", &number_of_numbers, &extra) == 1) {
                success = true;
            }
        }
        if(success) {
            printf("Success: %d\n\n", number_of_numbers);
        } else {
            printf("Invalid size\n\n");
        }
    }
    return 0;
}

Сеанс программы:

123
Success: 123

123a
Invalid size

123 a
Invalid size

123 9
Invalid size

a
Invalid size

-1
Success: -1

Причины использования fgets are

  • он не "глохнет", если есть неверный ввод: он уже прочитан.

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

...