c - char 到 float 的无效转换,不同的代码,没有好的结果

标签 c char atof

我想编写一个程序,接收一个介于 0 和 10 之间的数字,并显示一条消息,说明它是否有效。如果不是,它应该继续询问有效号码。

我可以编写所有代码,这对我来说似乎还不错,但它无法正常工作。

我看过很多有类似问题的题目,但我无法解决我的问题。我的意思是,我取得了一些进展,但我的代码还不能正常工作。

我做了什么: 我创建了一个变量来存储插入的值,使用 ctype 库确保它只接受数字,将我的 char 转换为 float 并检查它是否满足要求。

我尝试了一些不同的代码,我在谷歌上搜索了很多,现在我不知道我应该做什么。

代码 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:

我无法摆脱。

我调试了一下,发现在第二个while卡住了。

我尝试再次打印该值,又得到了 0.000...

好吧,我只是来这里是因为我在互联网上做了很好的研究,但我仍然无法解决我的问题。

如果我做错了什么(比如违反规则),我深表歉意。如果是这样,请告诉我,我会尽力修复它。

感谢您的关注。

最佳答案

请尝试以下代码。这是不言自明的。如果您需要任何具体解释,请告诉我。

#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");
}

关于c - char 到 float 的无效转换,不同的代码,没有好的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46841307/

相关文章:

Qt - 如何将数字转换为 QChar

c++ - 将 lexical_cast 字符串提升为两倍

c++ - 从文件中读取 long double,然后写入另一个文件

C++: atof() 有错误的行为

c - 在 C 中使用 argp 解析单个选项的多个值

c - 我的程序没有将输入数据存储到 C 中的结构中

c++ - 为什么我从这个字符串到 char 转换得到随机输出?

c++ - 在 C++ 中用未知元素初始化的 char 数组

c - 我正在写一个 fuse 文件系统。如何将额外的数据传递给fuse_operations?

c - 如何使用C选择文本文件的最后一行