在C语言中将字符转换为浮点数

3

我需要将字符转换为浮点数。我知道我们可以使用atof()函数来完成这个操作。但是我不想创建另一个变量来保存浮点数。我希望转换后的浮点数放在同一个变量中,像这样:

operand = atof(operand)

这里的operand是char类型。我也尝试了像这样的强制转换:

(float)operand = atof(operand)

但是没有用。

以下是完整的代码:

#include <stdio.h>
#include <stdlib.h>

void main() {
    float operand = 0.0F ;
    char operator = '0' ;
    printf("\nFollowing operators are supported : + - * / S E\n") ;
    float acc = 0.0F ;
    while((operand = getchar()) !=0 && getchar()==' ' && (operator = getchar()) != 'E') {
            (float)operand = atof(operand) ;
            switch (operator) {
                    case '+' : printf("\nAdd %f to Accumulator.\tResult : %f\n", operand , operand + acc);
                               acc+= operand ;
                    break ;
                    case '-' : printf("\nSub %f from Accumulator.\tResult : %f\n", operand, acc - operand);
                               acc-= operand ;
                    break ;
                    case '*' : printf("\nMultiply Accumulator with %f.\t Result : %f\n", operand, operand * acc);
                               acc = acc * operand ;
                    break ;
                    case '/' : printf("\nDivide Accumulator by %f.\tResult : %f\n", operand, acc / operand);
                               acc = acc / operand ;
                    break ;
                    case 'S' : printf("\nSet Accumulator to %f\n",operand) ;
                               acc = operand ;
                    break ;
                    default : printf("\nInvalid syntax\n") ;
            }
    }

任何帮助都是受欢迎的。


5
这篇文章中的XY问题气息几乎无法忽略。 - WhozCraig
atof函数不会将一个字符转换为浮点数。它将字符串解释为浮点值的十进制表示形式。 - davmac
1
@weston 变量总是会有一定的成本。这只取决于你所使用的系统是否对此成本敏感,例如嵌入式系统和桌面系统。 - Peter M
1
@PeterM 严格来说,一个新的本地变量不一定会有任何成本,因为编译器可能会将其优化掉。在像 OP 的代码这样的情况下(无论如何,它看起来都不是用于嵌入式系统的),我认为这是一个非常实际的考虑。可读性胜出。让编译器进行优化。如果必要,稍后再手动优化。 - davmac
1
@PeterM XY 问题是指你试图解决 X,但你不知道如何解决,然后你认为需要 Y,但你也不知道如何解决... 所以你问关于 Y 的问题。不,内存中不同的大小与 XY 问题无关... 这里的 Y 是 atof - autistic
显示剩余6条评论
2个回答

4

虽然这不同于将“字符转换为浮点数”,但从你问题中的各种提示来看,我认为你真正想要的是这个:

operand = operand - '0';

这将把操作数中通常为ASCII码的值转换为它所表示的值,从0到9。

通常情况下,getchar返回所键入字符的字符代码。例如,数字'0'的ASCII码是48('1'是49,依此类推)。如果用户键入'0',那么getchar将返回48,这是数字0的字符代码。现在,如果你减去'0'(即48),你就得到了0。这适用于数字0到9(即'1'-'0'=1,'2'-'0'=2等)。


我认为你可能是对的,但解释一下也无妨。 - Iharob Al Asimi
@iharob,好的,我添加了更多的解释。 - davmac
但请记住,getchar() 返回一个 int,因此使用正确的类型是必要的。 - Iharob Al Asimi
@iharob,你让我有点迷糊了。把一个 int 值赋给一个 float 变量是可以的,对吧? - davmac
1
@davmac。操作数=(float)(操作数- '0')就解决了问题(我猜)。虽然,我现在遇到了一个新问题(与此无关),但临时结果表明已实现浮点转换。谢谢。 - Plutonium smuggler
@davmac 是的,可以,但是 getchar() 函数的返回值是 int,这并不在它的名称中明确,因为它似乎应该是 char - Iharob Al Asimi

4

atof 不会将 char 转换为 float,它会将表示浮点数的字符串转换为 double

要将 char 转换为 float,只需直接赋值即可,因为存在从 charfloat 的隐式转换。

  signed char a = 4;
  float f = a;  // f now holds 4.f

但我不想创建一个新变量。这就是关键。我希望在同一个变量中以一个平稳的步骤实现它。 - Plutonium smuggler
@Plutoniumsmuggler 然后将它强制转换为 float,即 (float) a 是一个值为 4.f 的浮点数。 - ouah
请问您能否就给定的代码进行澄清?我已经编辑并添加了我的程序。 - Plutonium smuggler
@Plutoniumsmuggler 为什么你不想创建一个新变量?这有什么不好的呢? - Iharob Al Asimi
假设 char 保存的是一个字符,其值在 '0''9' 之间(而不是数值),那么 (float) (a - '0') 将会给你浮点数结果。但是你必须创建一个新的浮点变量来保存这个结果,因为你不能在声明后更改变量的类型。 - ouah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接