【问题标题】:How to convert int to char*?如何将 int 转换为 char*?
【发布时间】:2012-06-02 22:00:46
【问题描述】:

我的问题是我不知道如何将 int 值转换为 char 数组 char* m_value。我尝试使用 itoa 但它不起作用。 itoa(m_val, m_wartosc, 10);也许还有其他功能可以做到这一点?

Main.cpp

int main(int argc, char *argv[])
{
    LargeNumber l1;
    LargeNumber l3(172839); //how to convert this int to char*

    return 0;
}

LargeNumber.h

    class LargeNumber{

            public:

                LargeNumber()
                { 
                    m_array = "0"; //zero for no arg.
                }
                LargeNumber(int val):m_val(val)
                {
                    itoa(m_val, m_array, 10);  //doesn't work
                    //sprintf(m_array, "%d", m_val);
                }



                LargeNumber(const LargeNumber& p):m_array(p.m_array)
                { }  //copy constructor


                ~LargeNumber(){
                    delete []m_array;     //for object with new    
                }
               public: //should be private
                int m_val;
                char* m_array;

};

【问题讨论】:

  • 你为什么需要,你已经有一个构造函数接受int
  • 为什么要将您的号码以 10 进制存储为 ASCII 字符串?
  • 我的程序需要同时拥有它们。我已经有一个需要"string"。但是需要一个具有 int 值的变量。
  • 我知道将数字存储为 char* 是错误的,但我需要对此进行管理。
  • 旁注,如果使用默认构造函数,析构函数中的delete[] m_array 将尝试释放只读内存。

标签: c++ constructor char type-conversion


【解决方案1】:

简单的答案是:不要。有两个原因:

  • 正如您从所有(错误的)其他答案中看到的那样,内存管理很棘手且容易出错。
  • 我看不出将值以 10 为基数存储在 ASCII 字符串中可能会有用。 (例如,与 base-232 表示形式相比。)

但是如果真的一定要这样存储,就需要分配相应的内存,使用snprintf进行转换(itoa是非标准函数),记得在正确的时间(您将必须阅读和理解Rule of Three)。

我强烈建议使用 std::string 而不是原始 C 样式数组,因为它至少会处理自己的内存管理,然后您就可以使用 std::stringstream 填充它。

【讨论】:

  • 使用snprintf(即C90/C++03)。并使用std::vector<char> 获取必要的内存。
  • @JamesKanze:是的,我同意snprintf,答案已修改。在存储方面,我暗示有很多更好的惯用方法来处理这个问题。 vector<char> 只是一种可能性。
  • 你能写出我的程序中的 snprintf 函数应该是什么样子吗?
【解决方案2】:

你必须先用

分配数组
m_array = new char[20]

在调用 iota 之前在构造函数中。 iota 不分配内存。

【讨论】:

    【解决方案3】:
    LargeNumber(int val):m_val(val)
            {
                std::stringstream stream;
                stream << val;
                m_array = new char[stream.str().size()];
                strcpy(m_array, stream.str().c_str());
            }
    

    【讨论】:

    • 没有为m_array分配内存。
    【解决方案4】:

    itoa() 的第二个参数需要是一个足够大的内存数组以存储以 null 结尾的字符串。一个例子:

    int number = 172839;
    char buffer[10];
    itoa(number,buffer,10);
    

    【讨论】:

    • 所以在我的 char* m_array 没有声明大小之前我不能使用 itoa ?
    • 是的。在尝试将字符串存储在那里之前,您需要在该缓冲区中实际分配内存。
    猜你喜欢
    • 2017-03-21
    • 2011-04-09
    • 2018-05-15
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 2011-12-15
    • 2015-07-11
    相关资源
    最近更新 更多