Подтвердить что ты не робот

Неверное преобразование из 'const char *' в 'char *'

Введите код, показанный ниже. У меня проблема с передачей аргументов.

stringstream data;
char *addr=NULL;
strcpy(addr,retstring().c_str());

retstring() - это функция, которая возвращает строку.

//больше кода

printfunc(num,addr,data.str().c_str());

Я получаю сообщение об ошибке

неверное преобразование из 'const char *' в 'char *'.

аргумент инициализации 3 из 'void Printfunc (int, char *, char *)' в аргументе 3 функции

в приведенной выше строке. Функция вызывается, как показано ниже.

void Printfunc(int a,char *loc, char *stream)

пожалуйста, дайте мне знать, если мне нужно изменить любую инициализацию.

4b9b3361

Ответ 1

Ну, data.str().c_str() дает char const*, но ваша функция Printfunc() хочет иметь char* s. Основываясь на имени, он не изменяет аргументы, а просто печатает их и/или использует их для указания файла, и в этом случае вы, вероятно, должны исправить свое объявление как

void Printfunc(int a, char const* loc, char const* stream)

Альтернативой может быть включение char const* в char*, но исправление объявления предпочтительнее:

Printfunc(num, addr, const_cast<char*>(data.str().c_str()));

Ответ 2

string::c.str() возвращает строку типа const char *, как показано здесь

Быстрое исправление: попробуйте выполнить кастинг printfunc(num,addr,(char *)data.str().c_str());

В то время как вышеприведенное может работать, это поведение undefined и небезопасно.

Здесь более приятное решение с использованием шаблонов:

char * my_argument = const_cast<char*> ( ...c_str() );

Ответ 3

Прежде всего, этот фрагмент кода

char *addr=NULL;
strcpy(addr,retstring().c_str());

недействителен, потому что вы не выделили память, где вы собираетесь копировать функцию retstring(). c_str().

Что касается сообщения об ошибке, то это достаточно ясно. Тип выражения data.str(). C_str() - const char *, но третий параметр функции объявлен как char *. Вы не можете назначать объект типа const char * объекту типа char *. Любая функция должна определять третий параметр как const char *, если он не изменяет объект, указанный третьим параметром, или вы не можете передавать аргумент типа const char *.