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*
?
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*
?
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
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
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.
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.
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);
}