2014-08-28 5 views
30

В моем проекте есть метод, который возвращает только const char*, тогда как мне нужна строка char*, так как API не принимает const char*.Как преобразовать const char * в char * в C?

Любая идея как конвертировать между const char* в char*?

+5

Остерегайтесь того, что API, возможно, был разработан таким образом с уважительными соображениями. – alk

+0

@alk Я сказал об этом ниже, и это ситуация: const char * возвращается методом объектной-строковой строки [NSString является более конкретным). Это путь к файлу, который был сохранен. Теперь есть еще один api библиотеки C, который будет анализировать этот файл, и он принимает только строки char * в качестве аргументов.Даже если я передаю строку const char *, разбор происходит, но я получаю предупреждение, которое я не хочу видеть. – Morpheus

+0

Как указывали другие: поскольку вы никогда не знаете, что делает синтаксический анализатор (подумайте о том, что делает 'strtok()'), сделайте копию возвращенных данных и передайте копию. 'strdup()' и 'free()' являются вашими друзьями. – alk

ответ

17

Чтобы быть в безопасности, не нарушаете материал (например, когда эти строки изменяются в коде или дальше вверх), или врезаться вам программу (в случае, если возвращаемая строка была например, например, "hello I'm a literal string", и вы начинаете редактировать его), создайте копию возвращаемой строки.

Для этого вы можете использовать strdup(), но читайте small print. Или вы можете создать свою собственную версию, если ее нет на вашей платформе.

И остается вопрос: зачем вам нужен char*, вы не можете изменить свой код, чтобы он работал с const char*?

+0

Лучше может быть _strdup(). но, однако .. –

+0

Necro для ответа на вопрос, вы не можете изменить свой код: API часто требуют строки, char * или const char *, и, теоретически, вы можете изменить весь API, но это хорошая информация, чтобы знать, как для быстрого его преобразования – Skathix

30

Прежде всего, вы должны делать такие вещи, только если это действительно необходимо - например. для использования какого-либо API старого стиля с аргументами char*, которые не изменяются. Если значение отливки изменено, а исходная переменная была const, это неуказанное поведение == запрашивает проблемы.

Использование отливать:

(char*)const_char_ptr 
+6

Я думаю, что этот ответ, поскольку он вызывает слишком много опасной практики. Это можно улучшить, сделав предупреждения о неопределенном поведении более ясными и сильными. На данный момент я думаю, что многие читатели просто прочитают первые 2 строки и не заметят важных предупреждений. – PeterSW

+2

Теперь предупреждения сначала, и ответ позже. –

0

Вы можете бросить его, делая (char *)Identifier_Of_Const_char

Но есть probabbly причина, по которой апи не принимает const cahr *, вы должны сделать это только, если вы уверены, функция не пытается назначьте любое значение в диапазоне вашего const char*, которое вы наложили на неконстантный.

+1

const char * возвращается методом объектной-строковой строки [NSString является более конкретным). Это путь к файлу, который был сохранен. Теперь есть еще один api библиотеки C, который будет анализировать этот файл, и он принимает только строки char * в качестве аргументов. Даже если я передаю строку const char *, разбор происходит, но я получаю предупреждение, которое я не хочу видеть. – Morpheus

+0

@Morpheus В любом случае, вы не можете быть уверены, как долго вы не будете анализировать источник самостоятельно. – dhein

13

Вы можете использовать функцию strdup, которая имеет следующий прототип

char *strdup(const char *s1); 

Пример использования:

#include <string.h> 

char * my_str = strdup("My string literal!"); 
char * my_other_str = strdup(some_const_str); 

или зЬгсру/strncpy в буфере

или перезаписать свои функции, чтобы использовать const char * как параметр вместо char *, где это возможно, чтобы вы могли сохранить const

+2

strdup - это не стандартное воплощение. Итак, вы не должны быть уверены, что он «может его использовать». – dhein

+0

Реализация отсутствующего 'strdup()' - это вопрос 15 минут. – alk

+1

@alk конечно. Но поскольку ОП улавливает такую ​​проблему и просит решения, это, по-видимому, не является решением для него, «реализующего трупду самим собой». Знаешь? – dhein

3

A const Указатель указывает на ячейку памяти «только для чтения». В то время как те, у которых нет const, являются областями памяти для чтения и записи. Таким образом, вы «не можете» конвертировать const (только для чтения) в обычное (чтение-запись) местоположение.

Альтернативой является копирование данных в другое место для чтения и записи и передача этого указателя в нужную функцию. Вы можете использовать strdup() для выполнения этого действия.

+0

Точно. const указывается, чтобы сказать, что значение остается постоянным и не может быть дополнительно изменено. –

Смежные вопросы