В моем проекте есть метод, который возвращает только const char*
, тогда как мне нужна строка char*
, так как API не принимает const char*
.Как преобразовать const char * в char * в C?
Любая идея как конвертировать между const char*
в char*
?
В моем проекте есть метод, который возвращает только const char*
, тогда как мне нужна строка char*
, так как API не принимает const char*
.Как преобразовать const char * в char * в C?
Любая идея как конвертировать между const char*
в char*
?
Чтобы быть в безопасности, не нарушаете материал (например, когда эти строки изменяются в коде или дальше вверх), или врезаться вам программу (в случае, если возвращаемая строка была например, например, "hello I'm a literal string"
, и вы начинаете редактировать его), создайте копию возвращаемой строки.
Для этого вы можете использовать strdup()
, но читайте small print. Или вы можете создать свою собственную версию, если ее нет на вашей платформе.
И остается вопрос: зачем вам нужен char*
, вы не можете изменить свой код, чтобы он работал с const char*
?
Лучше может быть _strdup(). но, однако .. –
Necro для ответа на вопрос, вы не можете изменить свой код: API часто требуют строки, char * или const char *, и, теоретически, вы можете изменить весь API, но это хорошая информация, чтобы знать, как для быстрого его преобразования – Skathix
Прежде всего, вы должны делать такие вещи, только если это действительно необходимо - например. для использования какого-либо API старого стиля с аргументами char*
, которые не изменяются. Если значение отливки изменено, а исходная переменная была const, это неуказанное поведение == запрашивает проблемы.
Использование отливать:
(char*)const_char_ptr
Я думаю, что этот ответ, поскольку он вызывает слишком много опасной практики. Это можно улучшить, сделав предупреждения о неопределенном поведении более ясными и сильными. На данный момент я думаю, что многие читатели просто прочитают первые 2 строки и не заметят важных предупреждений. – PeterSW
Теперь предупреждения сначала, и ответ позже. –
Вы можете бросить его, делая (char *)Identifier_Of_Const_char
Но есть probabbly причина, по которой апи не принимает const cahr *
, вы должны сделать это только, если вы уверены, функция не пытается назначьте любое значение в диапазоне вашего const char*
, которое вы наложили на неконстантный.
const char * возвращается методом объектной-строковой строки [NSString является более конкретным). Это путь к файлу, который был сохранен. Теперь есть еще один api библиотеки C, который будет анализировать этот файл, и он принимает только строки char * в качестве аргументов. Даже если я передаю строку const char *, разбор происходит, но я получаю предупреждение, которое я не хочу видеть. – Morpheus
@Morpheus В любом случае, вы не можете быть уверены, как долго вы не будете анализировать источник самостоятельно. – dhein
Вы можете использовать функцию 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
strdup - это не стандартное воплощение. Итак, вы не должны быть уверены, что он «может его использовать». – dhein
Реализация отсутствующего 'strdup()' - это вопрос 15 минут. – alk
@alk конечно. Но поскольку ОП улавливает такую проблему и просит решения, это, по-видимому, не является решением для него, «реализующего трупду самим собой». Знаешь? – dhein
A const
Указатель указывает на ячейку памяти «только для чтения». В то время как те, у которых нет const
, являются областями памяти для чтения и записи. Таким образом, вы «не можете» конвертировать const
(только для чтения) в обычное (чтение-запись) местоположение.
Альтернативой является копирование данных в другое место для чтения и записи и передача этого указателя в нужную функцию. Вы можете использовать strdup()
для выполнения этого действия.
Точно. const указывается, чтобы сказать, что значение остается постоянным и не может быть дополнительно изменено. –
Остерегайтесь того, что API, возможно, был разработан таким образом с уважительными соображениями. – alk
@alk Я сказал об этом ниже, и это ситуация: const char * возвращается методом объектной-строковой строки [NSString является более конкретным). Это путь к файлу, который был сохранен. Теперь есть еще один api библиотеки C, который будет анализировать этот файл, и он принимает только строки char * в качестве аргументов.Даже если я передаю строку const char *, разбор происходит, но я получаю предупреждение, которое я не хочу видеть. – Morpheus
Как указывали другие: поскольку вы никогда не знаете, что делает синтаксический анализатор (подумайте о том, что делает 'strtok()'), сделайте копию возвращенных данных и передайте копию. 'strdup()' и 'free()' являются вашими друзьями. – alk