【问题标题】:Function to convert double/int into string将 double/int 转换为字符串的函数
【发布时间】:2013-07-31 22:16:04
【问题描述】:

我是 C++ 初学者,所以答案可能很明显。

我有两个函数 - 一个能够将 int 转换为 string,另一个能够将 double 转换为 string。然而,将这两者合二为一会更优雅。我已经用下面的代码试过了,但它会产生一个错误:'number' is not declared in this scope

string number_into_string (void* data, int psize)
{
    if (psize == sizeof(int))
    {
        int* number; number =(int*)data;
    }
    if (psize == sizeof(double))
    {
        double* number; number = (double*)data;
    }
    ostringstream convert;
    convert << number;
    string str = convert.str();
    return str;
}

int main()
{
    double x =1000;
    int y = 5;
    string str_x = number_into_string(&x, sizeof(x));
    string str_y = number_into_string(&y, sizeof(y));
}

【问题讨论】:

标签: c++ string type-conversion


【解决方案1】:

由于number 是在if ... { 括号内声明的,所以它只存在于那个空格中。此外,在 C 或 C++ 中,一个变量不能有两种不同的类型。

(如果您有 C++11 编译器,则根本不需要这样做,只需使用大多数标准类型都存在的std::to_string)。

解决办法是不使用指针,使用模板函数:

template<typename T> string number_into_string(T number)
{
    ostringstream convert;
    convert << number; 
    string str = convert.str();
    return str;
}

【讨论】:

  • 我猜你的意思是ostringstream,而不是ostringstring
  • 也许你可以为指针添加一个专门的版本,输出*number
  • @DrewMcGowen:谢谢。我不是第一次犯这个错误了。
  • @johnchen902:似乎完全没有必要。最有可能的是,原始数字一开始就不是指针 - 就像在示例中一样,它获取了它的地址。
  • @derek:是的,我假设 OP 在代码之前的某处有 using namespace std;,并且不想重写代码以使其看起来太不一样。
【解决方案2】:

简单,使用std::to_string函数。

【讨论】:

  • @Derek 如果你有一个不规则的编译器,使用std::fiber 会有所帮助。
【解决方案3】:

除了非常混乱之外,错误的主要原因是变量范围。每个变量都有自己的可见范围,超出该范围是不可见的。

number_into_string 函数中,您有 3 个作用域:

  1. 函数范围-这是整个函数number_into_string
  2. 第一个if
  3. 第二个if

函数范围的变量在两个 if 块中都可见,但反之则不可见。

这意味着,在您的代码中:

convert << number;

您正在使用当前范围内未知(可见)的变量。

另一件事是,您只是不能在 C++ 中执行此“通用值的事情”,而不使用模板或将“转换代码”的两个副本放入每个 if 块中,这将导致无效具有单一的“转换功能”。

另外,您不能使用sizeof可靠地区分doubleint

【讨论】:

  • 您可以通过引用传递typeid(x)...这将为您提供区分intdouble 的方法。但这似乎仍然是一个相当不确定的想法,除非您出于某种原因绝对必须拥有一个功能。
【解决方案4】:

一对花括号{} 创建一个嵌套作用域,在该作用域内创建的对象在外部作用域中不可见。你可以将你的代码重新排列成这样:

string number_into_string (void* data, int psize)
{
    ostringstream convert;
    if (psize == sizeof(int))
    {
        convert << *((int*) data);
    }
    if (psize == sizeof(double))
    {
        convert << *((double*) data);
    }
    return convert.str();
}

就我个人而言,我会使用标准库函数而不是(糟糕地)重新发明轮子。

【讨论】:

  • 当您考虑到标准没有做出sizeof(int) != sizeof(double) 的承诺时,在这里重新发明轮子特别麻烦。事实上,在具有 64 位 ints 的系统上,它们很可能 具有相同的大小。在这一点上事情变得有趣......
猜你喜欢
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
  • 2014-11-18
  • 2018-07-13
  • 2011-06-30
相关资源
最近更新 更多