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

Я пытался сделать небольшую программу-калькулятор, чтобы проверить свои навыки, потому что я довольно зеленый, когда говорю о кодировании. В любом случае, я пытаюсь создать функцию с циклом, который будет запрашивать число до тех пор, пока число не будет введено, и отклонит буквы.

Это то, что произвело мое ограниченное понимание/поиск в Google:

int is_number(int num){
    do {
        printf("\n:");
        scanf("%d",&num);
        if( isalpha(num)){
            printf("\nYou entered a letter, please input a number\n");
            continue;
        } else {
            printf("Number accepted...\n");
            break;
        }
    } while(isalpha(num));
    return num;
}

Единственная проблема в том, что он вылетает, если дать письмо, но прогресс есть... нет инфинитивного спама одного и того же сообщения.

Следующий код — это весь код, а не просто фрагмент:

#include<stdio.h>
#include<windows.h>
#include<ctype.h>

//Records the answer for Y/N question and checks if answer is Y or No

char check_yesno_question(char a){

    do{
        printf("\n:");
        scanf(" %c",&a);
        if((a=='Y')||(a=='N')||(a=='y')||(a=='n')){
            break;
        }
        else{
            printf("\nIncorrect answer, please input Y or N (Y = Yes, N = No)\n");
            continue;
        }
    }while((a!='Y')&&(a!='N')&&(a!='y')&&(a!='n'));

    return a;

}
//My sad attempt to test if number given is a letter

int is_number(int num){

    do{
        printf("\n:");
        scanf("%d",&num);
        if( isalpha(num)){
            printf("\nYou entered a letter, please input a number\n");
            continue;
        }
        else{
            printf("Number accepted...\n");
            break;
        }
    }while(isalpha(num));
    return num;
}

int main(){

    char YesNo1;
    int start;
    int StartWait=500;
    //char Choice;
    int number1;
    int number2;
    int number3;
    int number4;

    printf("Welcome to simple calculator 0.01\n");
    printf("At this stage calculator supports only 4 numbers\n");
    printf("Would you like to start simple calculator?\n");
    printf("Y/N?\n");                                            

    //Calls for check_yesno_question

    YesNo1=check_yesno_question(YesNo1);

    //Checks if answer is yes proceed, if answer is no, return 0;

    if((YesNo1=='y')||(YesNo1=='Y')){
        printf("Awnser = Yes\n");
        printf("Starting up the calculator");
        for(start=0;start<3;start++){
            printf(".");
            Sleep(StartWait);
        }
        printf("\n");
    }
    else{
        printf("Awnser = No\n");
        printf("Turning of the calculator");
        for(start=0;start<3;start++){
            printf(".");
            Sleep(StartWait);
        }
        printf("\n");
        return 0;
    }
    //Me wanting to make things look bit more clean

    system("cls");

    printf("---------------CALCULATOR---------------\n");
    //Calls for is_number
    number1=is_number(number1);

    return 0;
}

Как видите, он незакончен. Я в основном закончил искать ответы сам. Когда это было опубликовано, мое время было 4:04 утра.


person Community    schedule 31.07.2018    source источник
comment
Вам следует более внимательно изучить функцию scanf (и семейство). Например, что он возвращает.   -  person Some programmer dude    schedule 31.07.2018
comment
Кроме того, если я правильно понимаю вашу проблему, возможно, что-то вроде этого поможет: stackoverflow.com/questions/1478932/   -  person Alerra    schedule 31.07.2018
comment
@Someprogrammerdude, может быть, я действительно знаю ;D   -  person    schedule 31.07.2018
comment
В любом случае, сейчас 4 утра, я должен лечь спать и попробовать это завтра на свежую голову, потому что прямо сейчас... я даже не могу хорошо прочитать свой собственный код...   -  person    schedule 31.07.2018
comment
Нужно изучить или уже проверить? В коде, который вы показываете, вы не проверяете, и num никогда не будет буквенным символом (если только введенное число не совпадает с кодировкой единицы (например, вы вводите 97, что совпадает с ASCII закодированный символ 'a'), или вы передали символ в функцию, что напоминает мне: Почему вы передаете num в качестве аргумента?Это может быть просто локальная переменная).   -  person Some programmer dude    schedule 31.07.2018
comment
Почему вы конкретно хотите знать, является ли это письмом? Похоже, что вы на самом деле хотите знать, является ли это числом или нет, и если это не так, вам все равно, буква это, специальный символ или что-то еще?   -  person klutt    schedule 31.07.2018
comment
относительно: scanf("%d",&num); это НИКОГДА не будет вводить ничего, кроме ведущего - или + и некоторого количества цифр. Таким образом, вы должны: проверить возвращаемое значение (не значение параметра), чтобы убедиться, что операция прошла успешно. И если она не удалась, то вызвать getchar(), чтобы использовать оскорбительную букву, и повторять до тех пор, пока она не будет успешной.   -  person user3629249    schedule 01.08.2018


Ответы (1)


Из контекста кажется совершенно очевидным, что вас не интересует, буква это или нет. Вас интересует только то, является ли это числом или нет. Если это не число, вам все равно, буква это, специальный символ или что-то еще.

Предполагая выше, вы используете неправильный подход, а также неправильно используете scanf. scanf("%d", &num) всегда будет считывать число в num при условии, что чтение прошло успешно. Что вам нужно сделать, так это проверить, удалось ли чтение.

do{
    printf("\n:");
    if(scanf("%d",&num) != 1) { // If we did not perform a successful read
        printf("\nRead failed. Please input a number\n");
        continue;
    } else {
...
person klutt    schedule 31.07.2018
comment
После реализации этого кода я получил бесконечный спам Read failed. Пожалуйста, введите число, если было введено не число. Я понятия не имею, что вставить в while(). Я пробовал while(scanf("%d",&num) != 1);, но это не сработало. Были и другие попытки, что вставить в while(), но все они одинаково провалились. Также я действительно должен иметь это как петлю. Другое дело, что я понятия не имею, почему это ´!= 1´... - person ; 31.07.2018
comment
Я обнаружил, что это работает, если это не цикл, но если я пытаюсь сделать его циклом, он терпит неудачу и создает бесконечный спам. Я пробовал разные способы сделать из него петлю, do...while, while и goto, и ни один из них не преуспел. Они либо разбиваются, зацикливаются до бесконечности - person ; 31.07.2018
comment
@Картошка Жаль это слышать. В этом случае, пожалуйста, опубликуйте новый вопрос об этом, но убедитесь, что вопрос полностью ясен. Особенно включите ввод, который вызывает сбой. - person klutt; 01.08.2018