我知道的唯一方法是:
#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();
}
但有没有更少打字的方法?
答案 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的问题。
答案 8 :(得分:0)
好吧..首先,我需要执行此问题所要求的内容,但是我需要快速!不幸的是,“更好”的方式是近600行代码!请原谅与它的工作无关的名称。专有名称为 Integer64ToCharArray(int64_t值);
随时尝试清理该代码,而不会影响性能。
输入:从最小到最大范围的任何带符号的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;
}