C 为什么我输入字母字符时得到0.00?
下面是我编写的代码。我觉得我在指针上遗漏了什么,或者可能在计算中出错了。但正如我所看到的,一切对我来说似乎都很好,但当我输入时,例如:hello或其他任何东西,它会给我0.00作为输出 下面的答案是正确的C 为什么我输入字母字符时得到0.00?,c,C,下面是我编写的代码。我觉得我在指针上遗漏了什么,或者可能在计算中出错了。但正如我所看到的,一切对我来说似乎都很好,但当我输入时,例如:hello或其他任何东西,它会给我0.00作为输出 下面的答案是正确的 Enter a number: 6 Your number is: 6.00 但这是为什么呢 Enter a number: h Your number is: 0.00 以下是完整的代码: #include <stdio.h> #include <stdlib.h&
Enter a number:
6
Your number is: 6.00
但这是为什么呢
Enter a number:
h
Your number is: 0.00
以下是完整的代码:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 250
float myAtof(char *string, char *error);
int main() {
char string[SIZE]; // Array declaration.
float fnum1;
char errorState=0;
printf("Enter a number:\n");
gets(string);
fnum1=myAtof(string,&errorState);
if (errorState == 0) {
printf("Your number is: %.2f \n", fnum1);
} else if (errorState == 1) {
printf("Error has been occurred due to inappropriate input!\n");
}
return 0;
}
float myAtof(char* string, char* error) {
*error != '1';
float num= 0;
float decimalFlag = 1;
int decimalNumberFound = 0;
for (int i = 0; string[i]!= '\0'; i++) {
char ch = string[i];
if (ch != '.' && (ch < '0' || ch >'9')) {
error ='1';
return 0;
}
if (decimalNumberFound == 1 && ch == '.') {
error = '1';
return 0;
} else {
num = num* 10 + (ch - '0');
if (decimalNumberFound == 1)
decimalFlag *= 10;
}
}
num = num / decimalFlag;
return num;
}
#包括
#包括
#定义大小250
float myAtof(字符*字符串,字符*错误);
int main(){
字符字符串[SIZE];//数组声明。
浮动fnum1;
字符错误状态=0;
printf(“输入一个数字:\n”);
获取(字符串);
fnum1=myAtof(字符串和错误状态);
如果(errorState==0){
printf(“您的号码是:%.2f\n”,fnum1);
}else if(errorState==1){
printf(“由于输入不当而发生错误!\n”);
}
返回0;
}
浮点myAtof(字符*字符串,字符*错误){
*错误!=“1”;
float num=0;
浮点数=1;
int decimalNumberFound=0;
for(int i=0;字符串[i]!='\0';i++){
char ch=字符串[i];
if(ch!='.&(ch<'0'| ch>'9')){
错误='1';
返回0;
}
if(decimalNumberFound==1&&ch=='.')){
错误='1';
返回0;
}否则{
num=num*10+(ch-“0”);
如果(小数位数=1)
小数位数*=10;
}
}
num=num/decimalFlag;
返回num;
}
由于您的myAtof
例程有一个用于报告错误的参数,并且您的main
例程测试错误报告变量errorState
,因此您可能希望程序在输入“h”或其他非数字时打印错误消息,您的问题是它为什么打印“0.00”而不是错误消息
在用float myAtof(char*string,char*error)声明的函数中,error
是一个指针,*error
是它指向的对象。因此,当代码执行error='1'时
,尝试将指针设置为'1'
。它不会改变它指向的东西
编译此文件时,编译器发出了一条警告消息,类似于“警告:不兼容的整数到指针转换从“int”分配到“char*”。你不应该忽略这个消息
该函数还包含语句*error!='1';代码>。那句话毫无用处。它说将*error
的值与'1'
进行比较,看看它们是否不相等。的结果=
运算符为1或0,表示值是否不等。但这份声明与这一结果毫无关系。它只是被丢弃,因此该语句无效
函数中的任何内容都不会更改*error
的值,因此它指向main
中的errorState
的内容永远不会更改。因此,main
没有看到发生错误。它将errorState==0
计算为true,并执行printf(“您的编号为:%.2f\n”,fnum1)代码>
要解决此问题,请删除语句*error!='1';代码>并更改两个错误='1'代码>语句到*错误='1'代码>
另外,将'1'
更改为1
。将*error
设置为'1'
将其设置为字符“1”的代码。它没有将其设置为值1,这是errorState==1
测试的内容。通常,错误状态为0或1,而不是0或'1'
如果(errorState==1),也将else更改为else
。当您的if
和else
打算在某个条件X及其备选方案之间进行完全选择时,您不需要进行第二次测试。对于代码if(X){…}else if(Y){…}
,如果X为真,则执行第一个{…}
,如果X为假且Y为真,则执行第二个{…}
,如果X为假且Y为假,则执行两个都不执行。但是,如果你希望程序总是有一个数字或者有一个错误状态,那么就永远不会出现X为false,Y为false的情况。应该只有两种可能性,而不是三种。所以只要使用else
,如果的话就不要使用else
(从概念上讲,程序的errorState
不是0或1是一个bug,因此如果程序正常工作,则不会同时出现X false和Y false,而如果出现其他情况则可以。但是您确实存在bug,并且这不会导致{…}
待执行。设计代码以使用else
而不是不必要的else(如果
使其在出现错误时更能抵抗行为不端。以这种方式设计健壮的程序非常有用。)
还要注意编译器发出的警告消息。最好告诉编译器将所有警告都视为错误,这样当警告消息保留时,程序将不会编译。如果您使用的是GCC或Clang,请使用-Werror
开关。如果使用微软Visual C++,请使用<代码> /WX < /代码> .< /P>行>代码> *错误!1';代码>什么都不做。。。以及行error='1'代码>也不做任何事情。您需要打开编译器警告。您还尝试将error
设置为字符1
,但在main()
中,您将其与整数进行比较。一次编写几行代码,并使用调试程序确认代码按预期工作。一旦您能够解析一个一位数的正数,请将代码调整为多位数。当代码运行时,添加小数点处理。当每个有效数字都有效时,添加错误处理。更好的做法是将代码提交到git或其他版本中