2012-05-28 49 views
0

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

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; 

}; 
+0

为什么你需要,你已经有了一个'int'的构造函数。 –

+0

为什么要以ASCII字符串的形式将您的号码存储在10进制中? –

+0

我需要为我的程序同时使用它们。我已经有一个会拿''string''的。但是需要一个具有整型值的方法。 – mathewM

回答

0

itoa()需要的第二个参数是在存储器足够大来存储空终止字符串的数组。举个例子:

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

所以在我的情况下,我不能在我的char * m_array没有声明大小之前使用itoa? – mathewM

+0

是的。在尝试在那里存储字符串之前,您需要在该缓冲区中实际分配内存。 – Adam27X

0
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()); 
     } 
+0

没有为'm_array'分配内存。 – hmjd

+0

我忘了它,谢谢 – sithereal

+0

它太短了。 – hmjd

0

你必须先在阵列

m_array = new char[20] 

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

5

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

  • 正如你可以从所有的(错误的)其他答案中看到的,内存管理是棘手的并且容易出错。
  • 我看不到如何在base-10中将值存储在ASCII字符串中可能会有用。 (相比,说,基2 表示。)

但如果你真的必须这样保存它,你将需要分配的内存相关的量,使用snprintf转换(itoa是一个非标准的功能),并记住在正确的时间释放内存(您将阅读并了解有关Rule of Three)。

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

+1

使用'snprintf'(C90/C++ 03)。并使用'std :: vector '来获得必要的内存。 –

+0

@JamesKanze:是的,我同意'snprintf',回答修改。在存储方面,我暗示有很多更好的惯用方法来处理这个问题; '矢量'只是一种可能性。 –

+0

你能写一下snprintf函数应该在我的程序中看起来如何? – mathewM