Как получить ошибки для печати, если символы вводятся с помощью scanf в C

В данный момент я экспериментирую с c, и эта программа должна заставить пользователя ввести число в диапазоне от 10 до 100, если он вводит что-то, что не соответствует этим условиям, программа выйдет с кодом ошибки 1. что-нибудь который соответствует условиям, программа завершится с 0. Ниже приведен код, но он отказывается печатать правильную ошибку при обнаружении символа.

#include <stdio.h>
#include <stdlib.h>


int intGet(int ,int);
int error();
int userIn;
char x;

int main(void) {
    printf("Enter a number in between [10 -­100]: \n");
    x = scanf("%d", &userIn);
    intGet(x, userIn);

    return EXIT_SUCCESS;
}

int intGet(int min,int max ) {
    min = 10;
    max = 100;

    x = userIn;
    if ((x < min) || (x > max)) {
        printf("Input out of Range\n");
        exit(EXIT_FAILURE);
    } else if (x == 0) {
        printf("Incorrect input format\n");
        exit(EXIT_FAILURE);
    } else {
        printf("Read %d\n", userIn);
        exit(EXIT_SUCCESS);
    }
}

int error() {

}

person answerSeeker    schedule 17.09.2013    source источник


Ответы (2)


Непонятно, в чем ваша проблема. Какую ошибку вы ожидаете?

Вам нужно привести в порядок свой код. Есть несколько вещей. scanf возвращает int значение - количество назначенных элементов ввода. Вы присваиваете возвращаемое значение char x. Затем вы присваиваете входное значение x. В чем логика? Что вы ожидаете? Думаю, ваша проблема логична. Я предлагаю тебе:

  1. Отдельно обрабатывать возвращаемые и входные значения
  2. Удалить оператор exit(), вместо этого используйте возвращаемое значение. exit() завершает программу.
  3. Удалить глобальные объекты
  4. Если приведенное выше не помогает, используйте printf, чтобы увидеть, что обрабатывается

Пример:

int main(void) {
    printf("Enter a number in between [10 -­100]:\n");
    int userIn;
    int x = scanf("%d", &userIn);

    // for debug
    printf("Scanned: %d, returned: %d", x, userIn);

    int result = intGet(x, userIn);
    // analyse the result here
    switch (result) {
        case RES_SUCCESS:
           return SUCCESS;
        case ...
    }
}


int intGet(int x, int value) {
    int const min = 10;
    int const max = 100;

    if (x != 1) {
        return RES_ERROR_NO_INPUT;
    }

    if (value < min || value > max) {
        return RES_ERROR_OUT_OF_RANGE;
    }

    return RES_SUCCESS;
}
person dmitri    schedule 17.09.2013
comment
Когда я запускаю свой код, он полностью игнорирует оператор else if. Предполагается, что программа должна быть завершена, чтобы я мог узнать, завершилась ли она с 1 или 0 с echo $? - person answerSeeker; 17.09.2013
comment
Какое значение ввел пользователь? Попробуйте ввести значение 0 для вашего кода. - person dmitri; 17.09.2013
comment
введено значение a123. Он говорит, что ввод вне допустимого диапазона, но если я поставлю оператор if else перед if. если еще становится если. Он обнаружит символы, а не диапазон - person answerSeeker; 17.09.2013
comment
Вы пробовали добавить printf () в свой код в соответствии с моим примером? Если вы введете a123, то scanf (% d, & UserIn) вернет 0, а UserIn не получит никакого значения, то есть UserIn содержит случайное значение. Скорее всего, снаружи [10, 100]. a123 не является числом,% d означает целое число. - person dmitri; 17.09.2013
comment
Я ценю ответы, хотя они мне не очень помогли. Я выяснил, что мне нужно сделать, и исправил свой код другим способом. - person answerSeeker; 20.09.2013

Основная причина проблемы - коды ASCII для большинства символов находятся в диапазоне от 10 до 100.

Для решения вашей проблемы у меня есть сложное решение, но оно поможет:

шаги:

1. объявите свою переменную UserIn как char * OR массив символов

2. В функции scanf используйте% s вместо% d

3. вычислить длину введенной строки с помощью strlen (UserIn)

4.Если длина не равна 2 ИЛИ 3 по ошибке

5. теперь проверьте, нет ли UserIn[0] > 9 еще из-за ошибки

6. теперь проверьте, нет ли UserIn[1] > 9 еще из-за ошибки

7. теперь проверьте, равна ли длина 3 и UserIn[2] > 9 иначе из-за ошибки

8.Теперь вам нужно преобразовать эту строку в десятичное значение, используя:

decimal_UserIn = ((10^2)*UserIn[2])+((10^1)*UserIn[1])+((10^0)*UserIn[0])

9.Теперь вы можете проверить, подходит ли он вашему диапазону (10-100) или нет.

Здесь я предположил, что вам нужны введенные данные в десятичном формате для дальнейшей обработки, в противном случае вы можете напрямую проверить строки в пределах от 0 до 9 на шагах 5, 6 и 7.

P.S. Я могу помочь вам предоставить весь код, но у меня не хватает времени.

person Vagish    schedule 17.09.2013