在我的项目中,有一个方法只返回一个const char*,而我需要一个char*字符串,因为API不接受const char*。如何将const char*转换为char*?
const char*
char*
kwvwclae1#
首先,你应该只在真正有必要的情况下才做这些事情-例如,使用一些旧风格的API,使用未修改的char*参数。如果一个API函数修改了最初是const的字符串,那么这是未指定的行为,很可能会崩溃。使用施法:
(char*)const_char_ptr
svdrlsy42#
为了确保不破坏内容,请复制返回的字符串。返回const char*的函数期望这个字符串永远不会被更改。因此,如果您的代码或您传递给它的API毕竟做出了更改,那么事情可能/将中断。更糟糕的是,如果进行了更改,如果返回的字符串是文字(例如"hello I'm a literal string"),程序可能会崩溃,因为它们(通常)存储在无法写入的内存中。你可以使用strdup()来实现,但是要阅读small print,当然如果你的平台上没有的话,你也可以创建自己的版本。
"hello I'm a literal string"
strdup()
ycggw6v23#
您可以使用strdup函数,该函数具有以下原型
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
const char *
char *
const
ve7v8dk24#
指向指针的const表示“只读”内存位置。而没有const的是读写内存区域。因此,您“无法”将const(只读位置)转换为正常(读写)位置。另一种方法是将数据复制到不同的读写位置,并将此指针传递给所需的函数。您可以使用strdup()来执行此操作。
nhhxz33t5#
要将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); }
nmpmafwu6#
你可以通过执行(char *)Identifier_Of_Const_char来铸造它但是由于API不接受const cahr *可能是有原因的,你应该只这样做,如果你确定,函数不会试图将你的const char*范围内的任何值赋值给一个非常量。
(char *)Identifier_Of_Const_char
const cahr *
daupos2t7#
例如,你可以这样写:
const char* a = "art.bin"; char* b = new char[sizeof(a)]; strcpy(b, a);
7条答案
按热度按时间kwvwclae1#
首先,你应该只在真正有必要的情况下才做这些事情-例如,使用一些旧风格的API,使用未修改的
char*
参数。如果一个API函数修改了最初是const的字符串,那么这是未指定的行为,很可能会崩溃。使用施法:
svdrlsy42#
为了确保不破坏内容,请复制返回的字符串。
返回
const char*
的函数期望这个字符串永远不会被更改。因此,如果您的代码或您传递给它的API毕竟做出了更改,那么事情可能/将中断。更糟糕的是,如果进行了更改,如果返回的字符串是文字(例如
"hello I'm a literal string"
),程序可能会崩溃,因为它们(通常)存储在无法写入的内存中。你可以使用
strdup()
来实现,但是要阅读small print,当然如果你的平台上没有的话,你也可以创建自己的版本。ycggw6v23#
您可以使用
strdup
函数,该函数具有以下原型使用示例:
或strcpy/strncpy到缓冲区
或者重写函数,尽可能使用
const char *
作为参数,而不是char *
,以便保留const
ve7v8dk24#
指向指针的
const
表示“只读”内存位置。而没有const
的是读写内存区域。因此,您“无法”将const
(只读位置)转换为正常(读写)位置。另一种方法是将数据复制到不同的读写位置,并将此指针传递给所需的函数。您可以使用
strdup()
来执行此操作。nhhxz33t5#
要将
const char*
转换为char*
,可以创建如下函数:nmpmafwu6#
你可以通过执行
(char *)Identifier_Of_Const_char
来铸造它但是由于API不接受
const cahr *
可能是有原因的,你应该只这样做,如果你确定,函数不会试图将你的const char*
范围内的任何值赋值给一个非常量。daupos2t7#
例如,你可以这样写: