【问题标题】:How to convert a double variable into a char array in C++?如何在 C++ 中将 double 变量转换为 char 数组?
【发布时间】:2020-12-23 20:25:45
【问题描述】:

我正在为学校做一个项目,我们刚刚发现outtextxy()(graphics.h 中的一个函数,我们必须使用)需要作为文本参数a 字符数组。 这是它的声明:void outtextxy (int x, int y, char *textstring)

问题是我们需要打印出多个type double,包括小数点。我之前曾尝试使用其他类似问题的知识使其工作,但没有一个工作。

这是我最近的尝试,它导致了分段错误:

char *DoubleToString(long double x)
{
    char s[256]="\000";

    std::ostringstream strs;
    strs << x;
    string ss = strs.str();

    for(int i=0; i < ss.length(); i++)
        s[i] = ss[i];
    return s;
}

注意:我对编程还是有点陌生​​,我不完全知道 ostringstream 和看起来像移位的操作在做什么,但我试图复制粘贴那部分,希望它的工作。

【问题讨论】:

  • return s; 您正在返回一个局部变量的地址。未定义的行为。为什么不直接返回std::string
  • 要添加到@Paul 所说的内容,然后您将获取返回的字符串(称为str),然后调用outtextxy(x, y, str.c_str())
  • 您想将双精度数转换为其 c 字符串表示,对吗? double(10.125) 的值应该以字符数组 {'1', '0', '.', '1', '2', '5', '\0'} 结尾,对吗?
  • outtextxy(x,y,(char*)to_string(your_double).c_str());我觉得你可以这样用
  • @AndreiLoghin, 在任何情况下都不要返回一个指向局部变量的指针!! 鼻恶魔会发生,你的奶牛只会喂变质的牛奶等等!!从函数返回后,变量不再存在,内存可能用于其他目的。如果它似乎起作用,那只是运气不好。如果程序立即崩溃这样你就没有滴答作响的炸弹,那就更好了。您应该返回一个std::string 并调用outtextxy,并按照上面评论中显示的@qqq 进行转换。

标签: char double c++98 decimal-point


【解决方案1】:

... 需要一个字符数组作为文本参数。

好的,然后使用std::string

std::string DoubleToString(long double x)
{
    std::ostringstream strs;
    strs << x;
    return strs.str();
}

如果您需要底层字符数组,请使用字符串data() 方法。它确实返回指向字符串字符数组的第一个元素的指针。例如:

std::string s = DoubleToString(3.141);
function_that_needs_pointer_to_char( s.data() );

请注意,在 C++17 之前,data 返回了 const char*(从 C++11 开始,字符数组以空值结尾,正如人们所期望的那样;)。

【讨论】:

  • 我不需要使用字符,我只需要用outtextxy()显示它们。你的方法的问题是它给了我这个错误:invalid conversion from 'const char*' to 'char*' [-fpermissive]| 这是因为在 graphics.h 库中这样声明了 outtextxy:void outtextxy (int x, int y, char *textstring)
  • @AndreiLoghin 您使用的是哪个版本的 C++?正如我所提到的,它随着 C++17(这是当前版本)发生了变化
  • @largest_prime_is_463035818 C++20 是当前版本
  • 另一个改进是去掉DoubleToString,改为调用std::to_string
  • @AdreiLoghin 编辑中的代码具有未定义的行为。您不能返回指向局部变量的指针。如果这似乎有效,那只能靠运气了。无论如何,请不要编辑问题以添加解决方案。这就是答案的用途。您可以为自己的问题发布答案
【解决方案2】:

我知道这是未定义的行为,但它有效。而且我只需要将返回的char* 传递给outtextxy(),以后不需要对其进行操作,因为我将double 变量存储在一个对象中。

char *DoubleToString(long double x)
{
    char s[256]="\000";

    std::ostringstream strs;
    strs << x;

    string sd = strs.str();
    strcpy(s, sd.data());

    return s;
}

【讨论】:

  • 我知道这是未定义的行为,但它可以工作。 -- 你的代码不能“工作”。如果您使用不同的选项进行编译,甚至更改编译器,该代码可能会立即失败。答案基本上是不正确的 C++。
猜你喜欢
  • 2011-11-19
  • 1970-01-01
  • 2013-03-13
  • 2015-04-10
  • 1970-01-01
  • 2019-04-07
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
相关资源
最近更新 更多