#c #string
#c #строка
Вопрос:
Мне нужно преобразовать число в строку и сохранить его в const char*
но проблема в том, что const char*
переменная остается пустой после присвоения.
В следующем примере кода я ожидаю увидеть вывод числа, преобразованный в const char*
#include <iostream>
#include <string>
int main()
{
int number = 123;
const char* ptr_num_string = std::to_string(number).c_str();
std::cout << "number to string is: " << ptr_num_string << std::endl;
std::cin.get();
return 0;
}
Вывод пустой:
число в строке равно:
Как мне преобразовать число в постоянный символ *?
Ответ №1:
std::to_string
возвращает временноеstd::string
значение.- Указатель, возвращаемый с помощью
std::string::c_str
, становится недействительным из-за любой не-const
операции надstring
самимstring
— это потому, что это в основном дает вам указатель на внутренний буфер, в котором он находится.,. - Уничтожение
std::string
определенно не являетсяconst
операцией!
Следовательно, вы не можете ожидать, что возьмете указатель на, string
возвращаемый to_string
, и когда-либо сможете его использовать. Вам нужно сохранить копию этого string
в первую очередь:
int number = 123;
std::string const numAsString = std::to_string(number);
char const* ptrToNumString = numAsString.c_str(); // use this as long as numAsString is alive
То, что вы делаете, называется неопределенным поведением — это означает, что ваша программа недействительна, и может случиться что угодно. Это может привести к сбою, оно может распечатать какой-нибудь мусор, может показаться, что оно работает нормально, оно может выполнять одно из этих действий каждый раз, когда вы запускаете свою программу…
Ответ №2:
Это не «пустой», это указывает на буфер строки, который вышел за пределы области видимости. Таким образом, доступ к нему вызывает неопределенное поведение. Вам нужно сохранить строку живой:
auto str{std::to_string(number)};
auto ptr_num_string{str.c_str()};
std::cout << "number to string is: " << ptr_num_string << std::endl;