web-dev-qa-db-fra.com

Comment convertir const char * en char * en C?

Dans mon projet, il existe une méthode qui ne retourne qu'un const char*, alors que j'ai besoin d'un char* chaîne, car l’API n’accepte pas const char*.

Toute idée de la conversion entre const char* à char*?

44
Morpheus

Pour plus de sécurité, vous ne cassez pas de choses (par exemple, lorsque ces chaînes sont modifiées dans votre code ou ultérieurement), ou ne bloquez pas votre programme (dans le cas où la chaîne renvoyée était littérale, par exemple, comme "hello I'm a literal string" Et que vous commenciez à: éditez-le), faites une copie de la chaîne retournée.

Vous pouvez utiliser strdup() pour cela, mais lisez le petit format . Ou bien vous pouvez bien sûr créer votre propre version si elle n’existe pas sur votre plate-forme.

Et la question demeure: pourquoi avez-vous besoin d'un char*, Vous ne pouvez pas changer votre code pour qu'il fonctionne avec const char*?

21
meaning-matters

Tout d’abord, vous ne devriez faire de telles choses que si cela est vraiment nécessaire - par exemple, utiliser des API de style ancien avec char* arguments qui ne sont pas modifiés. Si une fonction de l'API modifie la chaîne qui était const à l'origine, il s'agit d'un comportement non spécifié, très probablement en panne.

Utiliser le casting:

(char*)const_char_ptr
42
Wojtek Surowka

Vous pouvez utiliser la fonction strdup qui a le prototype suivant

char *strdup(const char *s1);

Exemple d'utilisation:

#include <string.h>

char * my_str = strdup("My string literal!");
char * my_other_str = strdup(some_const_str);

ou strcpy/strncpy dans votre tampon

ou réécrivez vos fonctions pour utiliser const char * comme paramètre au lieu de char * _ si possible pour préserver le const

19
j123b567

Un const vers un pointeur indique un emplacement de mémoire en lecture seule. Alors que ceux sans const sont des zones de mémoire en lecture/écriture. Donc, vous "ne pouvez pas" convertir un const (emplacement en lecture seule) en un emplacement normal (lecture-écriture).

L'autre solution consiste à copier les données dans un emplacement de lecture-écriture différent et à transmettre ce pointeur à la fonction requise. Vous pouvez utiliser strdup() pour effectuer cette action.

5
raghav3276

Vous pouvez le lancer en faisant (char *)Identifier_Of_Const_char

Mais comme il y a probablement une raison pour laquelle l’API n’accepte pas const cahr *, vous ne devez le faire que si vous êtes sûr que la fonction ne tente d’attribuer aucune valeur dans la plage de votre const char* que vous avez jeté à un autre.

0
dhein

Pour convertir un const char* à char* vous pouvez créer une fonction comme celle-ci:

#include <stdio.h>

char* unconstchar(const char* s) {
    int i;
    char* res;
    for (i = 0; s[i] != '\0'; i++) {
        res[i] = s[i];
    }
    res[i] = '\0';
    return res;
}

int main() {
    const char* s = "hi this is bikash\n";
    char* p = unconstchar(s);
    printf("%s",p);
}
0
Bikash