如何在C中将const char *转换为char *?


69

在我的项目中,有一个方法仅返回a const char*,而我需要一个char*字符串,因为API不接受const char*

任何想法如何之间的转换const char*char*


8
请注意,API可能是出于这种考虑而设计的。
2014年

1
@alk我在下面说了这就是这种情况:const char *是由Objective-C字符串方法返回的(更具体的说是NSString)。这是已保存文件的路径。现在,还有另一个C库的api将解析此文件,并且仅将char *字符串作为参数。即使我通过const char *字符串,也会进行解析,但是会收到我不希望看到的警告。
Morpheus

正如其他人指出的那样:正如您永远不知道解析器的工作(想做什么strtok())一样,它会复制返回的数据并传递给副本。strdup()free()是你的朋友。
2014年

1
您能告诉我们它们是什么功能并链接到其文档吗?
mafso 2014年

1
在C ++中,有const_cast<>()
Kotauskas,

Answers:


30

为了安全起见,请不要破坏内容(例如,在代码中更改这些字符串或进一步修改字符串时),也不会使程序崩溃(以防万一返回的字符串是文字,例如"hello I'm a literal string",您开始对其进行编辑),返回的字符串的副本。

您可以使用strdup()它,但请阅读小字体。或者,如果平台上没有该版本,您当然可以创建自己的版本。


4
Necro对于这个问题的回答不能更改代码:API通常需要字符串,char *或const char *,是的,理论上您可以更改整个API,但是了解如何快速转换它是很好的信息
Skathix

@Skathix是的,API不能经常更改(我认为写错了)。删除了我的部分答案。谢谢!
含义-

51

首先,只有在确实有必要的情况下,才应执行此类操作-例如,使用一些带有char*未修改参数的旧式API 。如果API函数修改了原来为const的字符串,则这是未指定的行为,很有可能崩溃。

使用演员表:


11
我认为这个答案过于鼓励一种危险的做法。可以通过使有关未定义行为的警告更清楚和更强来改进它。目前,我认为许多读者只会阅读前两行,而不会注意到重要的警告。
PeterSW 2014年

3
现在首先是警告,然后是答案。
Wojtek Surowka

或者至少使用const_cast <char *>,这样编译器也知道。
MultiMat

@MultiMat在C中没有const_cast这样的东西
Wojtek Surowka '18

我的C ++生锈了,但是当它超出范围时,这不会引起问题吗?
里卡

22

您可以使用strdup具有以下原型的函数

使用示例:

或strcpy / strncpy到缓冲区

或重写您的函数以const char *用作参数(而不是char *在可能的地方),以便保留const


2
strdup是一个非标准实现。因此,您不应该确定他“可以使用它”
dhein

实施丢失strdup()仅需15分钟。
2014年

4
@alk当然。但是,由于OP遇到了这样的问题并正在寻求解决方案,所以这对他“靠自己实现strdup”可能不是解决方案,您知道吗?
dhein 2014年

@Zaibis:if (constptr) {char * p = calloc(strlen(constptr)+1, sizeof(*constptr)); if (!p) fail(); strcpy(p, constptr); my_nonconstptr_func(p); free(p);}
ALK

1
@alk好了,现在我们有了实现。我的声明没有任何改变。;)
dhein

6

const指针的A表示“只读”存储位置。而没有const的则为读写存储区。因此,您“无法”将const(只读位置)转换为普通(读写)位置。

另一种方法是将数据复制到其他读写位置,然后将此指针传递给所需的函数。您可以strdup()用来执行此操作。


1
究竟。指定const表示该值保持不变,无法进一步修改。
阿迪亚

1

你可以这样做 (char *)Identifier_Of_Const_char

但是由于很可能是api不接受的原因,const cahr *因此只有在确定的情况下,才应这样做,该函数不会尝试将const char*您转换为非const值的范围内的任何值赋值。


1
const char *是由Objective-C字符串方法返回的(更具体的说,是NSString)。这是已保存文件的路径。现在,还有另一个C库的api将解析此文件,并且仅将char *字符串作为参数。即使我通过const char *字符串,也会进行解析,但是会收到我不希望看到的警告。
Morpheus

@Morpheus无论如何,只要您不自行分析来源,就无法确定。
dhein 2014年

1

要将转换为const char*char*您可以创建如下函数:


1
在此代码中,使用了未初始化的变量res。此代码res[i] = s[i]是未定义的行为,很可能崩溃。
Wojtek Surowka

更新的代码:添加了对NULL的检查以及可能解决的未定义行为。
比卡什
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.