Вы пытаетесь изменить строковый литерал. Согласно Стандарту это вызывает undefined behavior. Еще одна вещь, которую следует иметь в виду (связанная), состоит в том, что строковые литералы всегда имеют тип const char*
. Существует специальная диспенсация для преобразования указателя в строковый литерал в char*
, забрав квалификатор const
, но основная строка - still const. Поэтому, делая то, что вы делаете, вы пытаетесь изменить const
. Это также вызывает неопределенное поведение, и сродни попытке сделать это:
const char* val = "hello";
char* modifyable_val = const_cast<char*>(val);
modifyable_val[1] = 'n'; // this evokes UB
Вместо того, чтобы возвращать const char*
из вашей функции, возвращает string
по значению. Это позволит построить новый string
на основе строкового литерала, и вызывающий код может делать все, что он хочет:
#include <string>
std::string Function1()
{
return “Some text”;
}
... позже:
std::string s = Function1();
s[1] = 'a';
Теперь, если вы пытаетесь изменить значение, которое Function()
повторяет, тогда вам нужно будет сделать что-то еще.Я хотел бы использовать класс:
#include <string>
class MyGizmo
{
public:
std::string str_;
MyGizmo() : str_("Some text") {};
};
int main()
{
MyGizmo gizmo;
gizmo.str_[1] = 'n';
}
[1] указывает на 2-й символ в строке ([0] будет первым) – climbage
Почему вы говорите C++ в названии, но отметьте вопрос C? – GManNickG
Вы должны пометить это как MSVC, так как gcc (по крайней мере> = 4) предупредит вас о назначении char const [] символу * устаревшим ... по уважительным причинам, как вы видите. – mmmmmmmm