81

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

知道如何在 to 之间转换const char*char*

4

6 回答 6

66

首先,只有在确实有必要时才应该做这些事情——例如,使用一些带有char*未修改参数的旧式 API。如果 API 函数修改了最初为 const 的字符串,那么这是未指定的行为,很可能会崩溃。

使用演员表:

(char*)const_char_ptr
于 2014-08-28T13:07:14.577 回答
31

为了安全起见,您不要破坏东西(例如,当这些字符串在您的代码中更改或进一步更改时),或使您的程序崩溃(如果返回的字符串是文字,例如"hello I'm a literal string",您开始编辑它),请制作一个返回字符串的副本。

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

于 2014-08-28T13:08:46.660 回答
28

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

于 2014-08-28T13:11:57.317 回答
7

指向指针的Aconst表示“只读”内存位置。而没有const的是读写内存区域。因此,您“不能”将const(只读位置)转换为普通(读写)位置。

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

于 2014-08-28T13:17:46.843 回答
2

要将 a 转换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);
}

于 2019-04-17T02:31:39.003 回答
1

你可以通过做(char *)Identifier_Of_Const_char

但是由于 api 不接受可能是有原因的,所以const cahr *您应该只执行此操作,如果您确定,该函数不会尝试在const char*您转换为非 const 的范围内分配任何值。

于 2014-08-28T13:09:41.440 回答