C 为什么我输入字母字符时得到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&

下面是我编写的代码。我觉得我在指针上遗漏了什么,或者可能在计算中出错了。但正如我所看到的,一切对我来说似乎都很好,但当我输入时,例如: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>
#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或其他版本中