无效的字符转换为浮动,不同的代码和没有好的结果

问题描述:

我想编写一个程序,它接收一个介于零和十之间的数字,并显示一条消息说它是否有效。如果不是,它应该继续询问一个有效的号码。无效的字符转换为浮动,不同的代码和没有好的结果

我可以编码一切,它对我来说似乎很不错,但它工作不正常。

我看到很多类似问题的话题,但我解决不了问题。我的意思是,我有一些进展,但我的代码还没有工作。

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

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

CODE 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 a nd初始化,但它也可以用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. 

我GOOGLE了它,我看到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 ...

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

如果我做错了任何事情(比如违反规则),我很抱歉。如果是这样,告诉我,我会尽力修复它。

感谢您的关注。

+0

你可以用'scanf()'在半打地方输入内容,但是你从不检查scanf的返回值,也不会打印输入的值。学会调试 - 不要以为你得到了你所期望的 - 打印出来! –

第二个方法请尝试以下代码。这是自我解释。如果您需要任何具体解释,请告诉我。

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

你试过了吗?它为你工作? – Kamal

+0

对不起,我需要一些时间来回答。在这几天我需要关注其他事情。感谢您的帮助。 现在我回来了。 我遇到了一个memset没有被声明的问题,但我做了一些研究,想通了我需要#include 它工作完美,但我不知道有足够的编程来做任何修改(并且不需要)。我研究了这些代码并学习了新的东西(比如使用“sizeof”)。这真的很有帮助。我有一个问题:你的代码是C++吗?那我写的那些呢?我试图用C来做,但是这些语言似乎有一点点不同。其C代码为 – HansMiku

+0

。你之前编写的代码看起来是C代码。 – Kamal

解决您这样

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