Problem mit strtok und Funktionsaufruf



  • Hallo zusammen,
    ich habe folgenden Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    
    int calc(char* arg2);
    
    main(int argc, char* argv[])
    {
    	calc("2+3");
    }
    
    int calc(char* arg2){
    	//char arg[]="2+3";
    	char delimiter[] = "+-";
    	char *ptr;
    
    	ptr = strtok(arg2, delimiter);
    	printf("%s", ptr);
    
    	return 0;
    }
    

    So das gannze führt zu einem Segfault.

    wenn ich aber folgendes tue:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    
    int calc(char* arg2);
    
    main(int argc, char* argv[])
    {
    	calc("2+3");
    }
    
    int calc(char* arg2){
    	char arg[]="2+3";
    	char delimiter[] = "+-";
    	char *ptr;
    
    	ptr = strtok(arg, delimiter);
    	printf("%s", ptr);
    
    	return 0;
    }
    

    Ich ändere einfach ptr = strtok(arg2 , delimiter); zu ptr = strtok(arg, delimiter);
    und benutze das chararray arg aus der Funktion.
    Nun funktioniert alles gut.

    Kann mir evtl. jemand erklären warum dies passiert bzw. was ich machen muss, damit Variante 1 funktioniert.

    Ich habe auch schon
    int calc(char arg2*){
    int calc(char arg2[]){
    int calc(char arg2){
    probiert...nichts will funktionieren

    Viele Grüße
    Florian



  • So geht's:

    char s[]="2+3";
    calc(s);
    

    strtok will schreiben, und du hast ihm ein Stringliteral gegeben.



  • Hallo,
    das liegt daran das strtok an die gefundenen Positionen eine 0 reinschreiben will.
    Bei char arg ="2+3"* darf strtok das aber nicht, weil arg auf einen schreibgeschützten Speicherbereich zeigt.
    Bei char arg[] = {"2+3"} darf strtok das, weil der vom Array arg belegte Speicherplatz beschrieben werden darf.

    florianwe23 schrieb:

    Ich habe auch schon
    int calc(char arg2*){
    int calc(char arg2[]){
    int calc(char arg2){
    probiert...nichts will funktionieren

    Viele Grüße
    Florian

    Deine erste Deklaration int calc(char arg2)* ist schon ok, du musst bloß ein beschreibbares Array übergeben und keinen Zeiger auf ein schreibgeschütztes Literal.

    Gruß,
    B.B.



  • jo funzt vielen dank!


Anmelden zum Antworten