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

owfi6suc  于 2023-03-22  发布在  其他
关注(0)|答案(7)|浏览(219)

在我的项目中,有一个方法只返回一个const char*,而我需要一个char*字符串,因为API不接受const char*
如何将const char*转换为char*

kwvwclae

kwvwclae1#

首先,你应该只在真正有必要的情况下才做这些事情-例如,使用一些旧风格的API,使用未修改的char*参数。如果一个API函数修改了最初是const的字符串,那么这是未指定的行为,很可能会崩溃。
使用施法:

(char*)const_char_ptr
svdrlsy4

svdrlsy42#

为了确保不破坏内容,请复制返回的字符串。
返回const char*的函数期望这个字符串永远不会被更改。因此,如果您的代码或您传递给它的API毕竟做出了更改,那么事情可能/将中断。
更糟糕的是,如果进行了更改,如果返回的字符串是文字(例如"hello I'm a literal string"),程序可能会崩溃,因为它们(通常)存储在无法写入的内存中。
你可以使用strdup()来实现,但是要阅读small print,当然如果你的平台上没有的话,你也可以创建自己的版本。

ycggw6v2

ycggw6v23#

您可以使用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

ve7v8dk2

ve7v8dk24#

指向指针的const表示“只读”内存位置。而没有const的是读写内存区域。因此,您“无法”将const(只读位置)转换为正常(读写)位置。
另一种方法是将数据复制到不同的读写位置,并将此指针传递给所需的函数。您可以使用strdup()来执行此操作。

nhhxz33t

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);
}
nmpmafwu

nmpmafwu6#

你可以通过执行(char *)Identifier_Of_Const_char来铸造它
但是由于API不接受const cahr *可能是有原因的,你应该只这样做,如果你确定,函数不会试图将你的const char*范围内的任何值赋值给一个非常量。

daupos2t

daupos2t7#

例如,你可以这样写:

const char* a = "art.bin";
char* b = new char[sizeof(a)];
strcpy(b, a);

相关问题