如何从 int 转换为 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();
}

但是有没有什么方法可以少打字呢?

472259 次浏览

你可以用助推器

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

C 风格的解决方案可以是使用 itoa,但是更好的方法是使用 ABC1/snprintf将这个数字打印成字符串。检查这个问题: 如何将整数转换为字符串可移植?

注意,itoa函数 is not defined in ANSI-C and is not part of C++, but is supported by some compilers.这是一个非标准函数,因此你应该避免使用它

还要注意,在用 C + + 编程时编写 C 风格的代码被认为是不好的做法,有时被称为“可怕的风格”。您真的想将它转换成 C 样式的 char*字符串吗?:)

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

    std::array<char, 10> str;
    std::to_chars(str.data(), str.data() + str.size(), 42);
    
  • In C++11, use std::to_string as:

    std::string s = std::to_string(number);
    char const *pchar = s.c_str();  //use char const* as target type
    
  • And in C++03, what you're doing is just fine, except use const as:

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

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

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

我想你可以使用 sprintf:

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

看看这个答案 https://stackoverflow.com/a/23010605/2760919

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

您也可以使用铸造。

例如:

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

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

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

好吧。.首先,我需要的东西,做什么这个问题是问,但我需要它快!不幸的是,“更好”的方式是 nearly 600 lines of code!!!原谅它的名称,这与它正在做的事情没有任何关系。正确的名字是 Integer64ToCharArray (int64 _ t 值) ;

Https://github.com/jeremydx/all-language-testing-code/blob/master/c%2b%2b%20examples/integertochararraytesting.cpp

请随意尝试在不影响性能的情况下清理代码。

Input: Any signed 64 bit value from min to max range.

Example:

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

产出:

Test: 9223372036854775807
Test: -9223372036854775808

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

最佳情况1位数值。

Loops: 100,000,000, Time Spent: 1,381(Milli), Time Per Loop 13(Nano)

更糟糕的情况是20位数值。

循环: 100,000,000,花费的时间: 22,656(毫米) ,每个循环的时间226(Nano

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

最佳情况1位数值。

循环: 100,000,000,花费的时间: 427(毫米) ,每个循环的时间4(纳米)

32 Bit Worst Case - 11 digit Value.

循环: 100,000,000,花费的时间: 1,991(毫米) ,每个循环的时间19(纳米)

负1万亿最坏情况-14位数值。

循环: 100,000,000,花费的时间: 5,681(毫米) ,每个循环的时间56(纳米)

64位更糟糕的情况-20位数值。

循环: 100,000,000,花费的时间: 13,148(毫米) ,每个循环的时间131(纳米)

How It Works!

我们执行一个分而治之的技术,一旦我们现在的字符串的最大长度,我们只是设置每个字符值单独。如上面的速度测试所示,长度越大性能损失越大,但是它仍然比原来的循环方法快得多,而且两个方法之间没有实际的代码更改,因此不再使用循环。

在我的用法中,我返回偏移量,而不是编辑字符数组的缓冲区,而是开始更新顶点数据,函数有一个额外的偏移量参数,所以它没有初始化为 -1。

将整数值转换为 std: : string,这样我们就可以知道数字的长度(数字的长度)。

然后我们创建字符串字母大小 + 1的字符数组长度,所以我们可以复制我们的值到字符串然后字符数组。

#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;
}