std::to_string хранить в постоянном символе*

#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;