111

我知道的唯一方法是:

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

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

4

10 回答 10

154
  • 在 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
    
于 2012-06-01T08:58:50.850 回答
14

我认为您可以使用 sprintf :

int number = 33;
char* numberstring[(((sizeof number) * CHAR_BIT) + 2)/3 + 2];
sprintf(numberstring, "%d", number);
于 2012-06-01T08:59:16.627 回答
7

你可以使用提升

#include <boost/lexical_cast.hpp>
string s = boost::lexical_cast<string>( number );
于 2012-06-01T08:56:16.597 回答
5

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

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

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

于 2012-06-01T08:57:43.403 回答
5

我不会在最后一行中对 const 进行类型转换,因为它的存在是有原因的。如果你不能忍受 const char* 那么你最好复制 char 数组,如:

char* char_type = new char[temp_str.length()];
strcpy(char_type, temp_str.c_str());
于 2012-06-01T08:59:05.033 回答
3

好吧..首先我需要做这个问题所要求的东西,但我需要它快!不幸的是,“更好”的方法是将近 600 行代码!!!请原谅它的名字与它所做的事情没有任何关系。正确的名称是Integer64ToCharArray(int64_t value);

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

随意尝试清理该代码而不影响性能。

输入:从 min 到 max 范围内的任何有符号 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(Nano

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

最佳情况 1 位数值。

循环:100,000,000,花费时间:427(Milli),每循环时间 4(Nano)

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

循环:100,000,000,花费时间:1,991(Milli),每循环时间 19(Nano)

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

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

64 位更坏情况 - 20 位数值。

循环:100,000,000,花费时间:13,148(Milli),每次循环时间 131(Nano)

这个怎么运作!

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

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

于 2019-01-05T04:25:07.960 回答
2

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

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

于 2014-04-11T11:01:00.997 回答
1

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

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

于 2019-01-01T14:12:09.213 回答
0

您也可以使用强制转换。

例子:

string s;
int value = 3;
s.push_back((char)('0' + value));
于 2017-01-22T08:49:30.180 回答
0

将我们的整数值转换为 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;
}
于 2020-10-17T16:52:12.867 回答