在我的项目中,有一个方法仅返回a const char*
,而我需要一个char*
字符串,因为API不接受const char*
。
任何想法如何之间的转换const char*
来char*
?
在我的项目中,有一个方法仅返回a const char*
,而我需要一个char*
字符串,因为API不接受const char*
。
任何想法如何之间的转换const char*
来char*
?
strtok()
)一样,它会复制返回的数据并传递给副本。strdup()
和free()
是你的朋友。
const_cast<>()
Answers:
为了安全起见,请不要破坏内容(例如,在代码中更改这些字符串或进一步修改字符串时),也不会使程序崩溃(以防万一返回的字符串是文字,例如"hello I'm a literal string"
,您开始对其进行编辑),返回的字符串的副本。
您可以使用strdup()
它,但请阅读小字体。或者,如果平台上没有该版本,您当然可以创建自己的版本。
首先,只有在确实有必要的情况下,才应执行此类操作-例如,使用一些带有char*
未修改参数的旧式API 。如果API函数修改了原来为const的字符串,则这是未指定的行为,很有可能崩溃。
使用演员表:
(char*)const_char_ptr
您可以使用strdup
具有以下原型的函数
char *strdup(const char *s1);
使用示例:
#include <string.h>
char * my_str = strdup("My string literal!");
char * my_other_str = strdup(some_const_str);
或strcpy / strncpy到缓冲区
或重写您的函数以const char *
用作参数(而不是char *
在可能的地方),以便保留const
strdup()
仅需15分钟。
if (constptr) {char * p = calloc(strlen(constptr)+1, sizeof(*constptr)); if (!p) fail(); strcpy(p, constptr); my_nonconstptr_func(p); free(p);}
const
指针的A表示“只读”存储位置。而没有const
的则为读写存储区。因此,您“无法”将const
(只读位置)转换为普通(读写)位置。
另一种方法是将数据复制到其他读写位置,然后将此指针传递给所需的函数。您可以strdup()
用来执行此操作。
你可以这样做 (char *)Identifier_Of_Const_char
但是由于很可能是api不接受的原因,const cahr *
因此只有在确定的情况下,才应这样做,该函数不会尝试将const char*
您转换为非const值的范围内的任何值赋值。
要将转换为const char*
,char*
您可以创建如下函数:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* unconstchar(const char* s) {
if(!s)
return NULL;
int i;
char* res = NULL;
res = (char*) malloc(strlen(s)+1);
if(!res){
fprintf(stderr, "Memory Allocation Failed! Exiting...\n");
exit(EXIT_FAILURE);
} else{
for (i = 0; s[i] != '\0'; i++) {
res[i] = s[i];
}
res[i] = '\0';
return res;
}
}
int main() {
const char* s = "this is bikash";
char* p = unconstchar(s);
printf("%s",p);
free(p);
}
res
。此代码res[i] = s[i]
是未定义的行为,很可能崩溃。