Hoe converteer je const char* naar char* in C?

In mijn project is er een methode die alleen een const char*retourneert, terwijl ik een char*string nodig heb, omdat de API const char*.

Enig idee hoe te converteren tussen const char*naar char*?


Antwoord 1, autoriteit 100%

Voor de zekerheid breek je dingen niet (bijvoorbeeld wanneer deze strings in je code of hoger worden gewijzigd), of laat je je programma crashen (in het geval dat de geretourneerde string letterlijk was, bijvoorbeeld als "hello I'm a literal string"en u begint deze te bewerken), maak een kopie van de geretourneerde tekenreeks.

Je zou hiervoor strdup()kunnen gebruiken, maar lees de kleine lettertjes. Of u kunt natuurlijk uw eigen versie maken als deze niet op uw platform staat.


Antwoord 2, autoriteit 96%

Allereerst moet je zulke dingen alleen doen als het echt nodig is – b.v. om een ouderwetse API te gebruiken met char*-argumenten die niet zijn gewijzigd. Als een API-functie de string wijzigt die oorspronkelijk const was, dan is dit niet-gespecificeerd gedrag, zeer waarschijnlijk crash.

Gebruik cast:

(char*)const_char_ptr

Antwoord 3, autoriteit 77%

U kunt de functie strdupgebruiken die het volgende prototype heeft

char *strdup(const char *s1);

Voorbeeld van gebruik:

#include <string.h>
char * my_str = strdup("My string literal!");
char * my_other_str = strdup(some_const_str);

of strcpy/strncpy naar je buffer

of herschrijf uw functies om waar mogelijk const char *als parameter te gebruiken in plaats van char *, zodat u de const


Antwoord 4, autoriteit 23%

Een constnaar een aanwijzer geeft een “alleen-lezen” geheugenlocatie aan. Terwijl degenen zonder constlees-schrijfgeheugengebieden zijn. U “kunt” dus een const(alleen-lezen locatie) niet converteren naar een normale (lezen-schrijven) locatie.

Het alternatief is om de gegevens naar een andere lees-schrijflocatie te kopiëren en deze aanwijzer door te geven aan de vereiste functie. U kunt strdup()gebruiken om deze actie uit te voeren.


Antwoord 5, autoriteit 6%

Om een const char*naar char*te converteren, zou je een functie als deze kunnen maken:

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

Antwoord 6, autoriteit 3%

Je kunt het casten door (char *)Identifier_Of_Const_char

te doen

Maar aangezien er waarschijnlijk een reden is dat de api const cahr *niet accepteert,
je moet dit alleen doen, als je zeker weet dat de functie geen waarde probeert toe te kennen binnen het bereik van je const char*die je hebt gecast naar een niet-const.

Other episodes