无效的字符转换为浮动,不同的代码和没有好的结果
问题描述:
我想编写一个程序,它接收一个介于零和十之间的数字,并显示一条消息说它是否有效。如果不是,它应该继续询问一个有效的号码。无效的字符转换为浮动,不同的代码和没有好的结果
我可以编码一切,它对我来说似乎很不错,但它工作不正常。
我看到很多类似问题的话题,但我解决不了问题。我的意思是,我有一些进展,但我的代码还没有工作。
我做了什么: 我创建了一个变量来存储插入的值,使用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 ...
嗯,我刚来这里是因为我在互联网上做了很好的研究,但是我仍然无法解决我的问题。
如果我做错了任何事情(比如违反规则),我很抱歉。如果是这样,告诉我,我会尽力修复它。
感谢您的关注。
答
第二个方法请尝试以下代码。这是自我解释。如果您需要任何具体解释,请告诉我。
#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");
}
你可以用'scanf()'在半打地方输入内容,但是你从不检查scanf的返回值,也不会打印输入的值。学会调试 - 不要以为你得到了你所期望的 - 打印出来! –