Я знаю только один способ:
#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();
}
Но есть ли способ с меньшим набором текста?
c++
integer
const-char
rsk82
источник
источник
Ответы:
В C ++ 17 используйте
std::to_chars
как:В C ++ 11 используйте
std::to_string
как:А в C ++ 03 то, что вы делаете, прекрасно, за исключением использования в
const
качестве:источник
std::string
по умолчанию вместоchar*
.std::string
он доступен по умолчанию, если это явно не указано в самом вопросе. Имеет смысл? Кроме того, поскольку в самом вопросе используетсяstd::string
(иstd::stringstream
), у вас нет особых причин не соглашаться с этим.Я думаю, вы можете использовать sprintf:
источник
-2147483647
.(((sizeof number) * CHAR_BIT) + 2)/3 + 2
похоже на волшебство ...Вы можете использовать ускорение
источник
Можно было бы использовать решение в стиле C
itoa
, но лучше вывести это число в строку с помощьюsprintf
/snprintf
. Отметьте этот вопрос: как переносимо преобразовать целое число в строку?Обратите внимание, что
itoa
функция не определена в ANSI-C и не является частью C ++, но поддерживается некоторыми компиляторами. Это нестандартная функция, поэтому вам следует избегать ее использования. Проверьте и этот вопрос: Альтернатива itoa () для преобразования целого числа в строку C ++?Также обратите внимание, что написание кода в стиле C при программировании на C ++ считается плохой практикой и иногда называется «ужасным стилем». Вы действительно хотите преобразовать его в
char*
строку C-стиля ? :)источник
Я бы не стал отбрасывать константу в последней строке, потому что она есть не просто так. Если вы не можете жить с const char *, вам лучше скопировать массив char, например:
источник
const char* char_type = temp_str.c_str();
лучше?std::vector<char> temp_vec(temp_str.begin(), temp_str.end()); temp_vec.push_back(0); char *char_type = &vec[0];
. Это дает вам изменяемую память, хотя, конечно, вам все равно нужно поддерживать вектор в живых до тех пор, пока вы хотите использовать указатель.string
и не возитесь со старым, простым, глупымchar *
из старого, простого C. <предназначенные кусочки пламени>char*
, а не в том, «есть ли смысл вызывать из C ++ в существующие библиотеки, написанные на C, или мне следует заново реализовать их на C ++?» ;-pХорошо ... сначала мне нужно было что-то, что делало бы то, о чем спрашивал этот вопрос, но мне нужно было это БЫСТРО! К сожалению, «лучший» способ - это почти 600 строк кода !!! Простите имя того, что не имеет ничего общего с тем, что он делает. Имя собственное - Integer64ToCharArray (значение int64_t);
https://github.com/JeremyDX/All-Language-Testing-Code/blob/master/C%2B%2B%20Examples/IntegerToCharArrayTesting.cpp
Не стесняйтесь попробовать очистить этот код, не снижая производительности.
Вход: любое знаковое 64-битное значение от минимального до максимального диапазона.
Пример:
Вывод:
Исходные тесты скорости: ( Integer64ToCharArray (); )
В лучшем случае 1-значное значение.
В худшем случае 20-значное значение.
Новые тесты скорости проектирования: ( AddDynamicallyToBuffer (); )
В лучшем случае 1-значное значение.
32-битный наихудший случай - 11-значное значение.
Отрицательный 1 триллион наихудший случай - 14-значное значение.
64-битный наихудший случай - 20-значное значение.
Как это устроено!
Мы выполняем технику «разделяй и властвуй», и как только мы установим максимальную длину строки, мы просто устанавливаем значение каждого символа индивидуально. Как показано в приведенных выше тестах скорости, большая длина приводит к большим потерям производительности, но все же намного быстрее, чем исходный метод цикла, и на самом деле код между двумя методами не изменился, кроме того, цикл больше не используется.
В моем использовании, отсюда и название, я вместо этого возвращаю смещение, и я не редактирую буфер массивов символов, а я начинаю обновлять данные вершин, а функция имеет дополнительный параметр для смещения, поэтому он не инициализируется значением -1.
источник
См. Этот ответ https://stackoverflow.com/a/23010605/2760919
В вашем случае просто измените тип snprintf с long ("% ld") на int ("% n").
источник
Это может быть немного поздно, но у меня была такая же проблема. Преобразование в char было решено в C ++ 17 с помощью библиотеки charconv.
https://en.cppreference.com/w/cpp/utility/to_chars
источник
Вы также можете использовать кастинг.
пример:
источник