Как конвертировать из 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();
}

Но есть ли какой-нибудь метод с меньшим набором символов?

Ответ 1

  • В С++ 17 используйте std::to_chars как:

    std::array<char, 10> str;
    std::to_chars(str.data(), str.data() + str.size(), 42);
    
  • В С++ 11 используйте std::to_string как:

    std::string s = std::to_string(number);
    char const *pchar = s.c_str();  //use char const* as target type
    
  • А в С++ 03 то, что вы делаете, просто отлично, за исключением использования const как:

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

Ответ 2

Вы можете использовать boost

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

Ответ 3

Я думаю, вы можете использовать sprintf:

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

Ответ 4

Решением C-стиля может быть использование itoa, но лучший способ - напечатать это число в строке, используя sprintf/snprintf. Проверьте этот вопрос: Как преобразовать целое число в строку переносимо?

Обратите внимание, что itoa функция не определена в ANSI-C и не является частью С++, но поддерживается некоторыми компиляторами. Это нестандартная функция, поэтому вам следует избегать ее использования. Также проверьте этот вопрос: Альтернатива itoa() для преобразования целого в строку С++?

Также обратите внимание, что писать код стиля C во время программирования на С++ считается плохой практикой и иногда называют "ужасным стилем". Вы действительно хотите преобразовать его в строку char* в стиле C?:)

Ответ 5

Я бы не стал выводить const в последней строке, так как он существует по какой-то причине. Если вы не можете жить с константой char *, тогда лучше скопировать массив char, например:

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

Ответ 6

См. этот ответ fooobar.com/questions/83968/...

Для вашего случая просто измените тип в snprintf от long ( "% ld" ) до int ( "% n" ).

Ответ 7

Вы также можете использовать кастинг.

Пример:

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

Ответ 8

Это может быть немного поздно, но у меня тоже была такая же проблема. Преобразование в char было решено в С++ 17 с библиотекой "charconv".

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

Ответ 9

Хорошо... во-первых, мне нужно что-то, что делало то, что задает этот вопрос, но мне нужно было БЫСТРО К сожалению, "лучший" способ - это почти 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 (Милли), время на петлю 13 (нано)

В худшем случае значение из 20 цифр.

Петли: 100 000 000, время нахождения: 22 656 (Милли), время на цикл 226 (нано)

Новые тесты скорости проектирования: (AddDynamicallyToBuffer();)

Лучший случай 1-значное значение.

Петли: 100 000 000, время нахождения: 427 (Милли), время на цикл 4 (нано)

32-битный худший случай - 11-значное значение.

Петли: 100 000 000, время, потраченное: 1 991 (Милли), время на петлю 19 (нано)

Отрицательный 1 триллион худшего случая - 14-значное значение.

Петли: 100 000 000, время нахождения: 5 681 (Милли), время на петлю 56 (нано)

64-разрядный худший случай - 20-значное значение.

Петли: 100 000 000, время нахождения: 13 148 (милли), время на петлю 131 (нано)

Как это устроено!

Мы выполняем технику "Разделяй и властвуй", и как только мы установили максимальную длину строки, мы просто устанавливаем каждое значение символа индивидуально. Как показано в приведенных выше тестах скорости, большие длины получают большие потери производительности, но они все еще намного быстрее, чем исходный метод цикла, и код между двумя методами фактически не изменился, за исключением того, что цикл больше не используется.

В моем использовании, следовательно, я возвращаю смещение вместо этого, и я не редактирую буфер массивов символов, а начинаю обновлять данные вершин, и у функции есть дополнительный параметр для смещения, поэтому он не инициализируется -1.