Schleife & Segmentation fault



  • Hallo zusammen,

    eigentlich möchte ich in ANSI C bei einem bestehendem String nur ein Zeichen suchen und austauschen. Allerdings habe ich in dem unten stehenden Code einen Segmentation fault.

    Könnt Ihr mir bitte sagen warum?
    Wie müsste es eigentlich aussehen?

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main (int argc, char *argv[]) {
        char *str = "Super,Duke";
        char *oldChar = ",";
        char *newChar = ".";
        int len,i_ctr,oldC_i,newC_i;
    
        newC_i = (int)(*newChar);
        oldC_i = (int)(*oldChar);
    
        len = strlen(str);
        for (i_ctr=0; i_ctr<len; i_ctr++) {
            // In der nachfolgenden Zeile steckt ein Segmentation fault
            if( str[i_ctr]==  oldC_i  ) str[i_ctr]= newC_i;
    
            printf("%c",str[i_ctr]);
        }
    
        // So weit kommt er erst gar nicht
        printf("\ndone");
        return EXIT_SUCCESS;
    
    }
    

    Vielen Dank für Eure Hilfe!



  • Du verwechselst Arrays mit Zeichen.
    Ein einzelnes Zeichen wird nur in einfachen Hochkomma eingeschlossen.

    char oldChar = ',';
        char newChar = '.';
    

    Ein Vergleich von Strings mit == ist in C nicht möglich.


  • Mod

    Mach aus Zeile 6 dies:

    char str[] = "Super,Duke";
    

    DirkB schrieb:

    Ein Vergleich von Strings mit == ist in C nicht möglich.

    Tut er doch gar nicht.



  • Du möchtest einen char* verändern, Stringliterale werden aber in einem Datenbereich abgelegt, der read only ist.
    Das Schreiben in diesem Bereich führt zu undefiniertem Verhalten, daher sollten Literale gleich als const deklariert werden.
    Wenn du das gemacht hättest, wäre es zu einem Compilerfehler gekommen, oder er hätte dich zumindest gewarnt.
    Die Lösung ist, str auf den Stack abzulegen:

    char str[] = "Super,Duke";
    

    Ein Schreibzugriff ist jetzt kein Problem.

    oldchar und newchar sollten auch nur chars, keine Zeiger sein, damit sparst du dir auch die Casts:

    int main()
    {
    	char str[] = "Super,Duke";
    	char oldChar = ',';
    	char newChar = '.';
    	int len,i_ctr;
    	len = strlen(str);
    	for (i_ctr=0; i_ctr<len; i_ctr++) {
    		if( str[i_ctr]==  oldChar  ) str[i_ctr]= newChar;
    		printf("%c",str[i_ctr]);
    	}
    	printf("\ndone");
    	return EXIT_SUCCESS; 
    }
    


  • Schön, dass eine Exception auftritt. Das sollte sie auch, da du versuchst, in einen Readonly-Speicherbereich zu schreiben:

    char *str = "Super,Duke";
    

    bedeutet nämlich implizit

    const char *str = "Super,Duke";
    

    Verwende einfach

    char str[] = "Super,Duke";
    

    Für die eigentliche Aufgabenstellung bietet sich aber eher strchr() an.



  • Ups, hab beim drüberschauen wohl oldC_i = (int)(*oldChar) übersehen.



  • Hallo zusammen,

    vielen Dank. Billiger Fehler aber große Auswirkung. Jetzt geht´s!
    Wenn ich meine Strings als

    char str[]
    

    im Funktionsaufruf einbaue habe ich sogar noch Call-by-reference.

    Frohes Schaffen!


Anmelden zum Antworten