Sonderzeichen aus String



  • Moin moin, ich hab schonwieder ein kleines Problemchen^

    Also ich soll ein C-Skript schreiben, welches aus einem über die Kommandozeile übergebenen String definierte Sonderzeichen entfernt.

    Beim Leerzeichen ' ' ist das soweit kein Problem (weil nur ein char).
    Aber mein Problem sind jetzt Steuerzeichen a la "\n" etc. pp.
    Die bestehen ja aus mehr als einem Character und sind daher ja eigentlich nur mit einer zusätzlichen Variable zu lösen oder?
    Also indem ich durch den String Zeichen für Zeichen iteriere, und wenn ein '\' gefunden wird, in einen Modus zu springen, der bei einem darauffolgenden 'n' die beiden Characters entfernt.

    Die "Vorgabe" ist nun aber eine Anweisungsstruktur, die mMn diesem Ansatz widerspricht:

    switch (xy){
    case '\n':
    blabla
    }
    

    Zeichenketttenfunktionen soll ich nicht nutzen.

    Mein voller Code:

    #include <stdio.h>
    
    int
    main(int argc,char *argv[]){
    
    int i;
    int z;
    
    //Alte Länge
    for(i=0; argv[1][i] != '\0'; i++);
       printf("Alte Länge von '%s' = %d Zeichen\n", argv[1], i);
    
    for(i=0; argv[1][i] != '\0'; i++){
            switch(argv[1][i]){
                    case '\n':
                    case ' ':
                            for(z=i; argv[1][z] != '\0'; z++){
                                    argv[1][z] = argv[1][z+1];
                            }
                            break;
            }
    }
    
    //Neue Länge
    for(i=0; argv[1][i] != '\0'; i++);
       printf("Neue Länge von '%s' = %d Zeichen\n", argv[1], i);
    
    return 0;
    }
    

    PS: Schon der Check auf einen Nullterminierten String kann doch anhand einer Überprüfung eines Characters nicht klappen, oder?

    Vielen Dank für einen kleinen Denkanstoß, ob meine Gedanken stimmen 😉



  • Du musst sie entfernen, wie andere Zeichen auch.
    Denn die Escape-Sequenzen sind nur EIN Zeichen. Deshalb kannst du sie ja auch in Charliterale packen und brauchst keine Stringliterale dafür. Weil das ist ein Zeichen. \n eben. Newline, ASCII-Code 10 eben. Mehr nicht.



  • hab jetzt wieder einige Zeit rumprobiert, ich verstehe, was du meinst.
    Ich soll also statt dem Zeichen lieber den ASCII Code des Zeichens checken, soweit so gut.

    Nur ich bekomm das einfach nicht zum laufen 😞

    Habe jetzt probiert einfach so zu checken:

    case 10:
    blabla
    

    Das klappt leider ebensowenig, wie wenn ich auf '/u0010' checke.
    Auch Casten des Characters zum Int mit atoi klappt nicht.
    Das habe ich im Kopf der Switch-Anweisung versucht, aber dann bekomme ich einen "Speicherzugriffsfehler (Speicherabzug geschrieben)".

    Grüße



  • Nein, du musst nicht auf den Ascii-Code prüfen.
    Einfach auf '\n'.



  • Vielen Dank schonmal für deine Mühe!

    Aber dann müsste doch mein obiger Code funktionieren oder nicht?
    Dort prüfe ich ja auf '\n'.

    switch(argv[1][i]){
                    case '\n':
                    case ' ':
                            for(z=i; argv[1][z] != '\0'; z++){
                                    argv[1][z] = argv[1][z+1];
                            }
                            break;
            }
    

    Aber der Code schlägt nur bei einem Leerzeichen an, ein \n in einem String übergeht er einfach.



  • Was gibst du denn in der Konsole ein?
    Weil alles bis zum ersten Whitespace(Leerzeichen, Tab, Newl) wird in argv[1] gespeichert, alles bis zum nächsten Whitespace in argv[2].
    Wenn du alles in argv[1] haben willst, musst du es in Anführungszeichen setzten.
    So:
    program.exe "Das ist in argv1" dasinargv2 dasinargv3 unddasinargv4



  • Jo, das ist mir eigentlich bewusst.

    Beispiel:

    ./testprogramm "hall o"

    wird zu "hallo", also richtig.

    ./testprogramm "hall\no"

    bleibt "hall\no" (sollte eig anders sein).

    ./testprogramm "hall \no"

    wird zu "hall\no" (das Leerzeichen wird entfernt, das \n Steuerzeichen ignoriert.



  • Ah, jetzt verstehe ich dein Problem.
    Du willst, dass eine Zeichenfolge bestehend aus \ und n ersetzt wird.
    Nicht auf das Newline-Zeichen.
    Dann musst du prüfen ob das ein Zeichen '\' ist und das nächste 'n'.
    Mein Fehler.



  • Ah ok, also wars in meinem Kopf doch richtig verstanden xD

    Vielen Dank dir!

    Und so mit dem 2-teiligen Check hatte ich es schon probiert, dann aber aufgegeben, weil es nicht klappte, weiß jetzt auch warum....

    Und die Moral von der Geschichte:
    Mehrere Stunden Lebenszeit verloren, weil ich ein

    "/"
    

    statt einem

    "\"
    

    benutzt hatte :P^^


Anmelden zum Antworten