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