【问题标题】:float to String conversion in c++ [closed]c++中的浮点到字符串转换[关闭]
【发布时间】:2012-11-05 06:27:05
【问题描述】:

我在 LPC 1769 微处理器上编程,但我无法弄清楚如何将浮点数转换为字符串,以便可以在我的 Display 上打印它。我正在使用sprintf 命令,但我的程序仍然显示内存错误。如何将float 转换为字符串?我需要在不使用标准库的情况下执行此操作。

【问题讨论】:

  • “请提供一个将浮点数转换为字符串的代码。”,您需要阅读:mattgemmell.com/2008/12/08/what-have-you-tried
  • @JohnnyGraber ?老实说,他可能没有尝试过任何东西,但他说的是 sprint 命令,也许他的意思是 sprintf,这意味着他正在尝试这样做:sprintf(charstar, "%f", floatvalue)
  • 首先检查你的微处理器和编译器是否支持浮点数。许多处理器没有。
  • 问题可能是 sprintf 实际上并没有在显示器上显示任何内容。他可能需要弄清楚如何在显示设备上打印一些东西
  • 好的,首先,您能否成功地将 sprintf() 更简单的东西输出到输出 - 例如文字字符串?如果是这样,请确保在您的构建配置中启用了对 printf/sprintf 的浮点支持(如 @naishsane 所暗示的那样)。如果是这样,您能否 sprintf 一个未由您的 A->D 驱动程序返回的 FP 值?您必须拆分此问题才能有效地对其进行调试。

标签: c++ microprocessors


【解决方案1】:

在 C++11 中,您可以使用 std::to_string 将数值转换为 std::string,您可以使用 c_str() 方法将其转换为 C 风格的字符串。

【讨论】:

  • 实际上我想要一个不包含任何标准库的代码。函数或任何其他库。包括
【解决方案2】:

这也可以:

#include <stdio.h>
#define MAXIMUM_TEXT_SIZE 64U
float value = 3.14159f;
char text_array[MAXIMUM_TEXT_SIZE];
snprintf(text_array, MAXIMUM_TEXT_SIZE, "%4.2f", value);

浮点值的字符串形式为text_array

在内存受限的嵌入式系统上使用std::string 之前,请确认您已设置适当的内存分配和垃圾回收。如果没有,请使用 allocator 从固定大小的内存池中分配字符串。在 SO 中搜索“fragmentation”。

【讨论】:

  • 拜托,你似乎已经足够长的时间来了解一个体面的答案。仅代码很糟糕,请解释..(是的,即使是这么短的代码。为什么选择 64 作为数组大小?为什么使用 %4.2f?)
  • @stefan:OP 没有给出格式化浮点的任何要求,只是输出它。这是嵌入式系统中的标准方法,我已经编程了 40 多年。文本数组是 64,因为这是 2 的一个很好的幂(用于对齐目的),还因为 OP 没有给出字符串的长度。另外,我使用snprintf,因为它比sprintf 更安全。你知道 C 代码也可以在 C++ 下编译吗?是什么让这个答案不好?
  • @stefan: "%4.2f" 是一个格式说明符,表示在 4 个字符宽(包括小数点)的字段中打印浮点值精度为 2 位。文本应显示为“3.14”。
  • 你不用跟我解释,这东西我都知道。它应该是答案的一部分。现在好多了,但%4.2f 似乎仍然是一个奇怪的选择。
【解决方案3】:

此代码将为您执行此操作:

#include <iostream>
#include <sstream>
#include <string>

int main()
{
    float val =3.456;
    std::stringstream stream;
    stream << val;
    std::string test = stream.str();
    std::cout << test << std::endl;
}

test 将包含来自 val 的浮点数,如 3.456。

看起来你正在尝试使用sprintf,在这种情况下你可以这样做:

char buffer[40]
float val =3.456;

sprintf(buffer, "%f", val);
std::string out(buffer);
std::cout << out << std::endl;

希望对您有所帮助。

【讨论】:

  • 请注意,混合使用 C I/O 和 C++ I/O 方法可能会有问题。请参阅 std::ios::widthstd::ios::precision 了解如何使用 C++ I/O 操纵器进行格式化。
  • @ThomasMatthews 感谢您的建议,我以为我分别提供了一个 c 方法和一个 c++ 方法,但你是对的,我正在使用 c++ 方法输出到 std::cout。
猜你喜欢
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
  • 2019-06-22
  • 2016-06-14
  • 1970-01-01
相关资源
最近更新 更多