如何从int转换为char *?

时间:2012-06-01 08:53:48

标签: c++ integer const-char

我知道的唯一方法是:

#include <sstream>
#include <string.h>
using namespace std;

int main() {
  int number=33;
  stringstream strs;
  strs << number;
  string temp_str = strs.str();
  char* char_type = (char*) temp_str.c_str();
}

但有没有更少打字的方法?

10 个答案:

答案 0 :(得分:111)

  • 在C ++ 17中,使用std::to_chars作为:

    std::array<char, 10> str;
    std::to_chars(str.data(), str.data() + str.size(), 42);
    
  • 在C ++ 11中,使用std::to_string

    std::string s = std::to_string(number);
    char const *pchar = s.c_str();  //use char const* as target type
    
  • 在C ++ 03中,除了使用const之外,你所做的一切都很好:

    char const* pchar = temp_str.c_str(); //dont use cast
    

答案 1 :(得分:9)

我认为你可以使用sprintf:

int number = 33;
char* numberstring[(((sizeof number) * CHAR_BIT) + 2)/3 + 2];
sprintf(numberstring, "%d", number);

答案 2 :(得分:8)

您可以使用提升

#include <boost/lexical_cast.hpp>
string s = boost::lexical_cast<string>( number );

答案 3 :(得分:5)

C风格的解决方案可能是使用itoa,但更好的方法是使用sprintf / snprintf将此数字打印到字符串中。请检查此问题:How to convert an integer to a string portably?

请注意,itoa函数未在ANSI-C中定义,并且不是C ++的一部分,但是某些编译器支持。这是一个非标准函数,因此您应该避免使用它。也请检查此问题:Alternative to itoa() for converting integer to string C++?

另请注意,在C ++中编程时编写C风格的代码被认为是不好的做法,有时也被称为“可怕的风格”。你真的想把它转换成C风格的char*字符串吗? :)

答案 4 :(得分:5)

我不会在最后一行中删除const,因为它存在是有原因的。如果你不能使用const char *那么你最好复制char数组,如:

char* char_type = new char[temp_str.length()];
strcpy(char_type, temp_str.c_str());

答案 5 :(得分:1)

请参阅此回答https://stackoverflow.com/a/23010605/2760919

对于您的情况,只需将snprintf中的类型从long(&#34;%ld&#34;)更改为int(&#34;%n&#34;)。

答案 6 :(得分:1)

您也可以使用投射。

<强> 例如:

string s;
int value = 3;
s.push_back((char)('0' + value));

答案 7 :(得分:1)

这可能会有点晚,但是我也遇到了同样的问题。 在C ++ 17中,使用“ charconv”库解决了转换为char的问题。

https://en.cppreference.com/w/cpp/utility/to_chars

答案 8 :(得分:0)

好吧..首先,我需要执行此问题所要求的内容,但是我需要快速!不幸的是,“更好”的方式是近600行代码!请原谅与它的工作无关的名称。专有名称为 Integer64ToCharArray(int64_t值);

https://github.com/JeremyDX/All-Language-Testing-Code/blob/master/C%2B%2B%20Examples/IntegerToCharArrayTesting.cpp

随时尝试清理该代码,而不会影响性能。

输入:从最小到最大范围的任何带符号的64位值。

示例:

std::cout << "Test: " << AddDynamicallyToBuffer(LLONG_MAX) << '\n';
std::cout << "Test: " << AddDynamicallyToBuffer(LLONG_MIN) << '\n';

输出:

Test: 9223372036854775807
Test: -9223372036854775808

原始速度测试:( Integer64ToCharArray();

最佳情况下为1位数。

  

循环数:100,000,000,耗时:1,381(Milli),每循环时间13(Nano)

错误的情况下20位数字值。

  

循环数:100,000,000,耗时:22,656(Milli),每循环时间226(纳米)

新设计速度测试:( AddDynamicallyToBuffer();

最佳情况下为1位数。

  

循环数:100,000,000,花费的时间:427(英里),每循环时间4(纳米)

32位最坏情况-11位数的值。

  

循环数:100,000,000,花费的时间:1,991(百万),每循环时间19(纳米)

1万亿美元最坏的情况-14位数值。

  

循环数:100,000,000,耗时:5,681(Milli),每循环时间56(Nano)

64位情况更糟-20位数字值。

  

循环数:100,000,000,耗时:13,148(Milli),每循环时间131(纳米)

工作原理!

我们执行分而治之方法,一旦我们现在达到了字符串的最大长度,我们就可以简单地分别设置每个字符值。如上面的速度测试所示,较大的长度会带来较大的性能损失,但它仍然要比原始循环方法快得多,并且在这两种方法之间实际上没有代码更改,只是不再使用循环。

因此,在我的用法中,我改为返回偏移量,并且我不编辑char数组的缓冲区,而是开始更新顶点数据,并且该函数具有用于offset的附加参数,因此未初始化为-1。

答案 9 :(得分:0)

将我们的整数值转换为std :: string,这样我们就可以知道多长时间(几位数)。

然后我们创建长度为字符串字母大小+1的char数组,因此我们可以将值复制到string然后是char数组。

#include <string>

char* intToStr(int data) {
    std::string strData = std::to_string(data);

    char* temp = new char[strData.length() + 1];
    strcpy(temp, strData.c_str());

   return temp;
}