我只知道:
#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(); }
但是有没有什么方法可以少打字呢?
你可以用助推器
#include <boost/lexical_cast.hpp> string s = boost::lexical_cast<string>( number );
C 风格的解决方案可以是使用 itoa,但是更好的方法是使用 ABC1/snprintf将这个数字打印成字符串。检查这个问题: 如何将整数转换为字符串可移植?
itoa
snprintf
注意,itoa函数 is not defined in ANSI-C and is not part of C++, but is supported by some compilers.这是一个非标准函数,因此你应该避免使用它
还要注意,在用 C + + 编程时编写 C 风格的代码被认为是不好的做法,有时被称为“可怕的风格”。您真的想将它转换成 C 样式的 char*字符串吗?:)
char*
在 C + + 17中,使用 std::to_chars作为:
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::to_string
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:
const
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 () ;)
循环: 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; }