【问题标题】:Convert char to float in c在c中将char转换为float
【发布时间】:2015-08-30 02:24:48
【问题描述】:

我需要将 char 转换为 float。我知道我们可以在 atof() 函数的帮助下做到这一点。但我不想创建另一个变量来保存浮点数。我希望转换后的浮点数进入同一个变量。像这样

操作数 = atof(操作数)

这里的操作数是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") ;
            }
    }

}

欢迎任何帮助。

【问题讨论】:

  • 这篇文章中XY problem 的香气几乎让人无法忽视。
  • @WhozCraig 。我在这里也提到了这个问题。我需要将 char 转换为 float 但不创建新变量。我希望转换后的值进入同一个变量。
  • @weston 变量总是要花一些钱。它只是归结为该成本对于您正在使用的系统是否重要。 EG 嵌入式与桌面系统。
  • @PeterM 严格来说,一个新的局部变量不一定会花费任何成本,因为编译器可能会将其优化为不存在。在像 OP 的代码这样的情况下(无论如何,它看起来不像是打算在嵌入式系统上运行),我认为这是一个非常现实的考虑。可读性获胜。让编译器优化。如果有必要,请稍后手动优化。
  • @PeterM XY 问题是您试图解决 X,但您不知道如何解决,并且您认为您需要 Y,但您也不知道如何解决。 ..所以你问Y。不,内存中的不同大小与XY问题无关,这里... Y是atof

标签: c floating-point char type-conversion


【解决方案1】:

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

要将char 转换为float,只需将其赋值即可,这是从charfloat 的隐式转换。

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

【讨论】:

  • 但我不想创建一个新变量。这才是重点。我想在同一个变量中一步到位。
  • @Plutoniumsmuggler 然后将其转换为float,即(float) a 是一个浮点值4.f
  • 你能用给定的代码澄清一下吗?我已编辑添加我的程序。
  • @Plutoniumsmuggler 为什么不想创建一个新变量?为什么这么糟糕?
  • @Plutoniumsmuggler 假设char 包含'0''9' 之间的字符(而不是数值),那么(float) (a - '0') 将为您提供浮点结果。但是你必须创建一个新的浮点变量来保存这个结果,因为你不能在声明后更改变量的类型。
【解决方案2】:

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

operand = operand - '0';

这会将operand 中的(通常)ASCII 值转换为它所代表的值,从 0 到 9。

通常,getchar 返回输入字符的字符代码。因此,例如,数字“0”的 ASCII 码是 48(而“1”的 ASCII 码是 49,依此类推)。如果用户输入“0”,则getchar 将返回 48,这是数字 0 的字符代码。现在,如果减去“0”(即 48),则得到 0。这适用于数字 0到 9(即 '1' - '0' = 1,'2' - '0' = 2 等等)。

【讨论】:

  • 我认为您可能是对的,但解释一下也无妨。
  • @iharob 好的,我添加了更多解释。
  • 但请记住,getchar() 返回一个 int,因此需要使用正确的类型。
  • @iharob 你把我弄丢了。将int 值赋给float 变量是可以的,对吧?
  • @davmac 。 operand = (float)(operand - '0') 成功了(我想)。虽然,我现在遇到了一个新问题(与此无关),但临时结果表明已实现浮点转换。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 2015-12-22
  • 2021-11-30
  • 2012-08-16
  • 2017-09-04
  • 2018-02-06
相关资源
最近更新 更多