Неверное преобразование символа в число с плавающей точкой, разные коды и хорошие результаты

Я хочу закодировать программу, которая получает число от нуля до десяти и показывает сообщение о том, что она действительна или нет. Если нет, он должен продолжать запрашивать действительный номер.

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

Я видел много тем с похожими проблемами, но я не мог решить свою проблему. Я имею в виду, у меня был некоторый прогресс, но мой код еще не работает.

Что я сделал: я создал переменную для хранения вставленного значения, использовал библиотеку ctype, чтобы убедиться, что она будет принимать только числа, преобразовал мой символ в число с плавающей точкой и проверил, соответствует ли он требованиям.

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

КОД 1:

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

main(){
    char grade;
    float grade2;

    printf("Please, insert a grade between 0 and 10.\n");
    printf("Grade: ");
    scanf("%c",&grade);

    while(isalpha(grade) || ispunct(grade) || isspace(grade) || iscntrl(grade)){
        printf("Please, insert a valid value.\n");
        fflush(stdin);
        printf("Grade: ");
        scanf("%c",&grade);
    }

    if(isdigit(grade)){
        grade2 = atof(grade);
        while(grade2 < 0 || grade2 > 10){
            printf("\nPlease, insert a valid value.\n");
            fflush(stdin);
            printf("grade: ");
            scanf("%c",&grade2);
        }

        printf("Valid value.\n");
    }

    else{
        printf("Restart the program and try again.");
    }

    system("PAUSE");
}

Большая проблема с кодом 1 заключается в том, что я получаю это:

[Error] invalid conversion from 'char' to 'const char*' [-fpermissive]

Я просто не могу заставить это работать, но это работает здесь (код, найденный в Интернете):

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

int main(){
    char a[10] = "3.14";
    float pi = atof(a);
    printf("Value of pi = %f\n", pi);
    return 0;
}

Я думал, что это будет scanf и инициализация, но он работал и при получении значения с помощью scanf.

Наконец, я подумал, что это может быть массив. Я сделал:

КОД 2:

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

main(){
    char grade[50];
    float grade2;

    printf("Please, insert a grade between 0 and 10.\n");
    printf("Grade: ");
    scanf("%c",&grade[50]);

    while(isalpha(grade[50]) || ispunct(grade[50]) || isspace(grade[50]) || iscntrl(grade[50])){
        printf("Please, insert a valid value.\n");
        fflush(stdin);
        printf("Grade: ");
        scanf("%c",&grade[50]);
    }

    if(isdigit(grade[50])){
        grade2 = atof(grade);
        while(grade2 < 0 || grade2 > 10){
            printf("\nPlease, insert a valid value.\n");
            fflush(stdin);
            printf("Grade: ");
            scanf("%c",&grade2);
        }
        printf("The grade is: %f\n", grade2);
        printf("Valid value.\n");
    }

    else{
        printf("Restart the program and try again.");
    }

    system("PAUSE");
}

Он всегда печатал, это действительное значение, независимо от того, какое число я написал. Итак, я изменил код, чтобы увидеть значение, которое он сравнивал, и результат был:

Please, insert a grade between 0 and 10.
Grade: 11
The grade is: 0.000000
Valid value.

Я погуглил и увидел, что atof может вернуть ноль, если что-то не так.

Итак, последнее, что я попытался сделать, это использовать эту модель: (также найденную в интернете)

double atof(const char *str) 

В заключение,

КОД 3:

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

main(){
    char grade;

    printf("Please, insert a grade between 0 and 10.\n");
    printf("Grade: ");
    scanf("%c",&grade);

    while(isalpha(grade) || ispunct(grade) || isspace(grade) || iscntrl(grade)){
        printf("Please, insert a valid value.\n");
        fflush(stdin);
        printf("Grade: ");
        scanf("%c",&grade);
    }

    if(isdigit(grade)){
        float atof(grade *grade);
        while(grade < 0 || grade > 10){
            printf("\nPlease, insert a valid value.\n");
            fflush(stdin);
            printf("Grade: ");
            scanf("%c",&grade);
        }
        printf("The grade is: %f\n", grade);
        printf("Valid value.\n");
    }

    else{
        printf("Restart the program and try again.");
    }

    system("PAUSE");
}

Выход был:

Please, insert a grade between 0 and 10.
Grade: 11

Please, insert a valid value.
Grade: 6

Please, insert a valid value.
Grade: 10

Please, insert a valid value.
Grade: 5

Please, insert a valid value.
Grade:

Я не мог выбраться из этого времени.

Я отладил его и обнаружил, что он застрял во второй раз.

Я попытался напечатать значение снова, и я получил еще 0,000...

Ну, я просто пришел сюда, потому что я провел хорошее исследование в интернете, но я до сих пор не могу решить свою проблему.

Извините, если я делаю что-то не так (например, нарушая правила). Если это так, скажите мне, и я постараюсь это исправить.

Спасибо за Ваше внимание.

2 ответа

Решение

Пожалуйста, попробуйте ниже код. Это говорит само за себя. Если вам нужно какое-то конкретное объяснение, пожалуйста, дайте мне знать.

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

int isnumeric_array(char *string)
{
    while( (char)(*string) != '\0') {
        if( !isdigit( (char)(*string) ) ) {
            return 0;
        }
        string++;
    }

    return 1;
}

int main(){
    char grade[128];
    float grade2;

read_input:
    memset(grade, 0x0, sizeof(grade));
    printf("Please, insert a grade between 0 and 10.\n");
    printf("Grade: ");
    scanf("%s", grade);

    if(isnumeric_array(grade) == 0) {
        goto read_input;
    }

    grade2 = atof(grade);
    if((grade2 < 0) || (grade2 > 10)) {
        goto read_input;
    }
    else {
        printf("You have entered right value\n");
    }

    system("PAUSE");
}

Исправить свой второй подход, как это

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

int main(void){
    char grade[50];
    float grade2;//int grade2; ?
    int invalid;//flag
    int i;

    printf("Please, insert a grade between 0 and 10.\n");

    do {
        invalid = 0;//false
        printf("Grade: ");fflush(stdout);
        fgets(grade, sizeof grade, stdin);
        for(i = 0; grade[i] && grade[i] != '\n'; ++i){
            if(!isdigit((unsigned char)grade[i])){
                invalid = 1;//It contains illegal characters.
                break;
            }
        }
        if(!invalid){
            grade2 = atof(grade);
            if(grade2 < 0 || grade2 > 10){
                printf("\nPlease, insert a valid value.\n");
                invalid = 1;//Invalid input range
            }
        }
    } while(invalid);
    printf("The grade is: %f\n", grade2);
    printf("Valid value.\n");
    //printf("Restart the program and try again.");//never execute

    system("PAUSE");
}
Другие вопросы по тегам