strtok und pointers



  • hi,

    ich das prob, dass strtok nich das tut was es tun soll xD

    Folgender Code bringt den Fehler:

    "Unbehandelte Ausnahme bei 0x102af11e (msvcr80d.dll) in testC.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x004157db."
    
    int main()
    {
            printf("%d", ipToInt("127.0.0.1"));
            getchar();
            return 0;
    }
    unsigned int ipToInt(char ip[])
    {
    	/* char ip[] = "127.0.0.1"; */ /* <-- mit dem gehts */
    	unsigned int resIp = 0;
    	char * pch;
    	int i = 3;
    
    	pch = strtok (ip,".");
    	while (pch != NULL  && i >= 0)
    	{
    		int x = charsToInt(pch); /* charsToInt is selbstgeschrieben, aber hat ja mit dem fehler nix zu tun*/
    		resIp += x * (int)pow(255,i);
    		pch = strtok (NULL, ".");
    		i--;
    	}
    	return resIp;
    }
    

    ich denk mal es liegt daran, dass strtok nicht mit nem pointer zurecht kommt, aber wie lös ich das?

    wäre super wenn mir ejmand helfen könnte
    schonmal vielen dank im voraus

    mfg



  • Das Problem bei dir ist das String-Literal, da es schreibgeschützt ist. strtok erwartet aber ein char*:
    Nimm also einfach:

    {
        char ip[] = "127.0.0.1";
        printf("%d", ipToInt(ip));
        getchar();
        return 0;
    }
    

    Tja, die Fallstricke von C....



  • Th69 schrieb:

    Das Problem bei dir ist das String-Literal, da es schreibgeschützt ist.

    Wenn wir schon beim Thema sind: Gibt es irgendeinen guten Grund dafür, dass String-Literale vom Typ 'char *' und nicht 'const char *' sind?
    Oder liegt das einfach daran, dass const oder was auch immer erst standardisiert wurde, nachdem es unzähligen Millionen Quelltext gab, deren Kompatibilität man nicht brechen wollte ?



  • mh, geiler fehler xD
    wär ich nie selbst drauf gekommen, aber gut zu wissen

    vielen dank an dich, Th69

    edit:
    heißt quasi, dass die in C die funktion direkten zugriff auf den parameter hat, und nicht nur ne kopie bekommt oder?
    also wenn ich innerhalb der funktion den wert lösch is der futsch?



  • man strtok. Ja die Funktion verändert den Pointer. Vielleicht guckst du dir auch mal strsep an.



  • c-hasser schrieb:

    Th69 schrieb:

    Das Problem bei dir ist das String-Literal, da es schreibgeschützt ist.

    Wenn wir schon beim Thema sind: Gibt es irgendeinen guten Grund dafür, dass String-Literale vom Typ 'char *' und nicht 'const char *' sind?
    Oder liegt das einfach daran, dass const oder was auch immer erst standardisiert wurde, nachdem es unzähligen Millionen Quelltext gab, deren Kompatibilität man nicht brechen wollte ?

    Ja, so ungefähr... und daher wurde es bei C++ dann auf "const char *" korrigiert.


Anmelden zum Antworten