"\n" am Ende des Strings entfernen



  • Hallo, ich habe eine Zeichenkette/String welche ganz zum Schluss ein "\n" beinhaltet. Wie bekomme ich den Zeilenumbruch da weg? Ich kann ihn zwar lokalisieren, aber alles was ich versucht habe um ihn zu entfernen führte zum Segmentation fault...

    Hier mal nen Codebeispiel zum Problem

    void main()
    {
        Ausgabe("Das ist ein Text\n");
    }
    
    void Ausgabe(char *text)
    {
        if(text[strlen(text)-1] == 10
              // Aktion um das \n zu entfernen
    
        printf("%s", text);
    
    }
    


  • text[strlen(text)-1] == '\0';



  • Der Crash in diesem Beispiel (naja, nicht in exakt diesem, das kompiliert nicht) wird dadurch verursacht, dass du versuchst ein Stringliteral zu ändern. Diese sind i.d.R. nicht beschreibbar. main() sollte eher so aussehen:

    int main (void) {
    
        // string ist nun ein veränderbares Array welches mit einem Stringliteral initialisiet wird
        char string[] = "Das ist ein Text\n";
    
        Ausgabe (string);
    
        return 0;
    }
    

    Die Funktion zum ändern selbst würde ich eher so machen:

    void Ausgabe (char *text) {
    
        char *tmp = strrchr (text, '\n'); // nicht irgendwelche kryptischen Zahlen verwenden, wenn '\n' auch geht
    
        // wenn ein '\n' gefunden wird, string terminieren
        if (tmp) {
            *tmp = '\0';
        }
        return;
    }
    

    Imho lesbarer.

    Aber ein Problem hat die Funktion dann immernoch: Sie verändert ihr Argument, während dem Aufrufer suggeriert wird, dass das Argument nur ausgegeben wird. Sicher dass du das so willst?



  • wie waers mit:

    void ausgabe(char* text) {
      while(*text && *text!='\n') {
        putchar(*text);
        ++text;
      }
    }
    

    ?



  • Danke sehr Tim.. das funktioniert dann tatsächlich.

    Aber eine Lösung ist das für mich leider noch nicht so ganz. Weil an die Stelle in meinem richtigen Programm (das war eben nur ein Minibeispiel fürs Problem) wo die Ausgabe("..."); geöffnet wird, kann ich eigentlich nichts ändern. Gibts denn noch eine andere Möglichkeit, die Sache irgendwie zu umgehen. Also das ich direkt Text übergeben kann und trotzdem ein mögliches \n unterdrucken kann.



  • Den Text in ein neues char Array schreiben und dort deine Änderungen machen.



  • Nooob schrieb:

    Aber eine Lösung ist das für mich leider noch nicht so ganz. Weil an die Stelle in meinem richtigen Programm (das war eben nur ein Minibeispiel fürs Problem) wo die Ausgabe("..."); geöffnet wird, kann ich eigentlich nichts ändern. Gibts denn noch eine andere Möglichkeit, die Sache irgendwie zu umgehen. Also das ich direkt Text übergeben kann und trotzdem ein mögliches \n unterdrucken kann.

    putchar verwenden



  • Shade Of Mine schrieb:

    Nooob schrieb:

    Aber eine Lösung ist das für mich leider noch nicht so ganz. Weil an die Stelle in meinem richtigen Programm (das war eben nur ein Minibeispiel fürs Problem) wo die Ausgabe("..."); geöffnet wird, kann ich eigentlich nichts ändern. Gibts denn noch eine andere Möglichkeit, die Sache irgendwie zu umgehen. Also das ich direkt Text übergeben kann und trotzdem ein mögliches \n unterdrucken kann.

    putchar verwenden

    Sorry, hatte dein Beitrag zu spät gelesen, klappt wunderbar, danke 🙂



  • Mist, zu früh gefreut. Also das funktioniert ja wirklich, nur erfolgt die Ausgabe ja sofort Häppchenweise und der eigentliche String wird nicht geändert. Ich brauch aber leider diesen String (ohne \n halt) weil er noch gemeinsam mit anderen Sachen ausgegeben wird...

    @feigling: Dachte ich mir auch, klappt aber leider nicht.



  • Ich habe da meinen trim():

    char *
            trim ( S)
            char *S;
    {
            char    *e, *s;
    
            s = S;
    
            e = s + strlen(s);
            while ( e >= s){
                    if ( ( *e & 255) <= 32)
                            *e = 0;
                    else
                            break;
                    e--;
            }
            return S;
    }
    

    schmeißt alles kleiner oder gleich Leertaste am Stringende raus.
    Praktisch und effektiv.



  • @Scheppertreiber: damit kann ich irgendwie gar nichts anfangen....



  • @schleppi: Das ist ja noch K&R C wenn ich mich nicht irre oder?
    @offtopic: chomp wäre die richtige wahl in perl...



  • wurst schrieb:

    @schleppi: Das ist ja noch K&R C wenn ich mich nicht irre oder?

    Da siehst Du mal wie lange das schon funktioniert ... 🙂



  • Nooob schrieb:

    Ich brauch aber leider diesen String (ohne \n halt) weil er noch gemeinsam mit anderen Sachen ausgegeben wird...

    dann leg dir doch eine kopie an, ohne das \n
    🙂


Anmelden zum Antworten