Wie schaffe ich es das restliche, nicht befüllte array nullterminieren lassen?



  • Hallo Leute,

    Ich versuche ein Programm zu schreiben, dass ein Buchstabe zu einem Wort hinzufügt...und naja, das habe ich eigentlich auch geschafft, aber leider gibt es bei der Ausgabe das Problem, dass ausser dem
    neuem Wort auch die restlichen Zeilenelemente mit diesen Zeichen hier ╠╠╠╠╠╠╠╠╠╠ befüllt werden.

    Ich habe selbstverständlich im diesem Forum hier schon gesehen, dass einige so ein ähnliches
    Problem hatten und immer wieder vorgeschlagen worden ist, dass die restlichen Stellen des
    Arrays nullterminieren zu lassen. Dies habe ich auch selbstverständlich versucht, aber es
    funktionierte einfach nicht.

    Könnt ihr mir bitte helfen und schreiben, wie ich mein Ziel erreiche? Ob ich nur was hinzufügen muss oder doch was ganz anderes machen soll? Die Sache ist, man muss die Stringlength-Funktion nutzen um die Aufgabe zu erfüllen...sonst wäre es ja einfach zu lösen...Ich bin Anfänger und habe mein bestes gegeben

    int stringlength(char *w);

    int main()
    {
    char wort[50], b;

    cout << "Wort eingeben: " ; 
    
    cin >> wort; 
    
    cout << "Buchstaben eingeben: " ; 
    
    cin >> b;  
    
    cout << "\n" << endl; 
    
    wort[stringlength(wort)] = b; 
    
    cout << wort << endl ; 
    
    _getch();
    
    return 0;
    

    }

    	int stringlength(char *w) 
    	{
    		int i = 0;
    		while (w[i] != '\0') 
    			i++; 
    		return i; 
    
    			       }
    

    mfg 🙂



  • @noskynet sagte in Wie schaffe ich es das restliche, nicht befüllte array nullterminieren lassen?:

    Ich habe selbstverständlich im diesem Forum hier schon gesehen, dass einige so ein ähnliches
    Problem hatten und immer wieder vorgeschlagen worden ist, dass die restlichen Stellen des
    Arrays nullterminieren zu lassen. Dies habe ich auch selbstverständlich versucht, aber es
    funktionierte einfach nicht.

    Ich sehe nichts davon.

    Verwende std::string, nicht char arrays.

    Vermutlich ist dein Lehrer YAIT (yet another incompetent teacher)

    Du bist im falschen Forum. Aber vermutlich verführt die neue Struktur dazu.



  • @manni66 sagte in [Wie schaffe ich es das restliche, nicht befüllte array nullterminieren lassen?]

    Ich sehe nichts davon.

    Was siehst du nicht? Meine Bemühungen oder die Hieroglyphen-Ausgabe?
    btw ich nutze Microsoft Visual Studio 2017...

    Verwende std::string, nicht char arrays.

    Also soll ich das char durch ein string ersetzen oder muss ich das Programm jetzt komplett neu schreiben?

    Vermutlich ist dein Lehrer YAIT (yet another incompetent teacher)

    Eigentlich ist es ein Prof^^´

    Du bist im falschen Forum. Aber vermutlich verführt die neue Struktur dazu.

    Sorry



  • Meine Bemühungen

    Genau

    Also soll ich das char durch ein string ersetzen oder muss ich das Programm jetzt komplett neu schreiben?

    wort sollte ein std::string sein. Anhängen wäre dann wort += b;. Fertig!
    Aber vermutlich lernst du erst C, später dann C++. YAIT eben.

    Vermutlich ist dein Lehrer YAIT (yet another incompetent teacher)

    Eigentlich ist es ein Prof^^´

    Das macht es nicht besser.


  • Mod

    Das wäre zwar korrektes C++, aber nicht im Sinne des Aufgabenstellers, der lieber C mit cout sehe möchte. Was hier im Sinne der Aufgabenstellung gemacht werden müsste:

    1. Den Buchstaben an der Position stringlength(wort) setzen. Das hast du schon.
    2. Danach ein Nullzeichen '\0' an der Position stringlength(wort) + 1 setzen. Das fehlt noch.

    Wie manni66 schon sagte, hast du damit (ziemlich schlechtes) C gelernt, aber immerhin bekommst du so die Punkte für die Hausaufgabe. Falls du richtiges C++ lernen möchtest, schau mal in die Linkliste für Neulinge hier im Forum. "Richtiges" C++ ist ziemlich anders als das, was du bisher gelernt hast.



  • @seppj sagte in Wie schaffe ich es das restliche, nicht befüllte array nullterminieren lassen?:

    1. Den Buchstaben an der Position stringlength(wort) setzen. Das hast du schon.
    2. Danach ein Nullzeichen '\0' an der Position stringlength(wort) + 1 setzen. Das fehlt noch.

    In der Reihenfolge wird es nicht funktionieren, da stringlength keinen gültigen Wert ermitteln kann. Die einfachste Lösung wäre wohl char wort[50] = {}; am Anfang des Programms.



  • @manni66 sagte in Wie schaffe ich es das restliche, nicht befüllte array nullterminieren lassen?:

    In der Reihenfolge wird es nicht funktionieren, da stringlength keinen gültigen Wert ermitteln kann.

    Nach erfolgreichem cin >> wort; ist wort Nullterminiert.



  • @swordfish sagte in Wie schaffe ich es das restliche, nicht befüllte array nullterminieren lassen?:

    @manni66 sagte in Wie schaffe ich es das restliche, nicht befüllte array nullterminieren lassen?:

    In der Reihenfolge wird es nicht funktionieren, da stringlength keinen gültigen Wert ermitteln kann.

    Nach erfolgreichem cin >> wort; ist wort Nullterminiert.

    Nach wort[stringlength(wort)] = b; nicht mehr.



  • @seppj sagte in Wie schaffe ich es das restliche, nicht befüllte array nullterminieren lassen?:

    Das wäre zwar korrektes C++, aber nicht im Sinne des Aufgabenstellers, der lieber C mit cout sehe möchte. Was hier im Sinne der Aufgabenstellung gemacht werden müsste:

    1. Den Buchstaben an der Position stringlength(wort) setzen. Das hast du schon.
    2. Danach ein Nullzeichen '\0' an der Position stringlength(wort) + 1 setzen. Das fehlt noch.

    Wo ist die Position "stringlength(wort)+1"? Das steht nirgendwo in meinem Code...

    Wie manni66 schon sagte, hast du damit (ziemlich schlechtes) C gelernt, aber immerhin bekommst du so die Punkte für die Hausaufgabe. Falls du richtiges C++ lernen möchtest, schau mal in die Linkliste für Neulinge hier im Forum. "Richtiges" C++ ist ziemlich anders als das, was du bisher gelernt hast.

    Das werde ich tun 🙂 ,

    ich habe einige Probleme mit Programmierung und ja, wir haben die Vorlesung "Grundlagen der Programmierung" und das Grundpraktikum Programmierung gleichzeitig ...das ist für jemanden
    ,der ein totaler Anfänger ist, so, als würde man ins tiefe kalte Wasser geworfen werden, ohne schwimmen zu können... 😔 😔 😔



  • @manni66 sagte in Wie schaffe ich es das restliche, nicht befüllte array nullterminieren lassen?:

    Nach wort[stringlength(wort)] = b; nicht mehr.

    Dann wird man sich den Wert von stringlength(wort) wohl merken müssen.



  • In der Reihenfolge wird es nicht funktionieren, da stringlength keinen gültigen Wert ermitteln kann. Die einfachste Lösung wäre wohl char wort[50] = {}; am Anfang des Programms.

    Vielen vielen Dank, ich habe es gerade so eingesetzt mit char wort[50] = {} , ganz am Anfang und es funktioniert.

    Vielen Vielen Dank 🙂



  • @swordfish sagte in Wie schaffe ich es das restliche, nicht befüllte array nullterminieren lassen?:

    @manni66 sagte in Wie schaffe ich es das restliche, nicht befüllte array nullterminieren lassen?:

    Nach wort[stringlength(wort)] = b; nicht mehr.

    Dann wird man sich den Wert von stringlength(wort) wohl merken müssen.

    Klar. Wenn man verstanden hat, was hier nicht funktioniert. Deswegen ja auch meine Frage nach den Bemühungen.



  • @noskynet sagte in Wie schaffe ich es das restliche, nicht befüllte array nullterminieren lassen?:

    1. Danach ein Nullzeichen '\0' an der Position stringlength(wort) + 1 setzen. Das fehlt noch.

    Wo ist die Position "stringlength(wort)+1"? Das steht nirgendwo in meinem Code...

    Deswegen steht da ja auch Das fehlt noch.



  • @noskynet sagte in Wie schaffe ich es das restliche, nicht befüllte array nullterminieren lassen?:

    Vielen vielen Dank, ich habe es gerade so eingesetzt mit char wort[50] = {} , ganz am Anfang und es funktioniert.

    Du hast das Problem nicht begriffen

    Erweitere dein Programm so, dass nochmal ein Wort eingelesen wird und ein Buchstabe angehängt wird. Dann gib ein kürzeres Wort ein.



  • @dirkb sagte in Wie schaffe ich es das restliche, nicht befüllte array nullterminieren lassen?:

    @noskynet sagte in Wie schaffe ich es das restliche, nicht befüllte array nullterminieren lassen?:

    Vielen vielen Dank, ich habe es gerade so eingesetzt mit char wort[50] = {} , ganz am Anfang und es funktioniert.

    Du hast das Problem nicht begriffen

    Ja das Problem war, dass das char array "wort" eine Zeichensbegrenzung von 50 Zeichen hat.
    Beim hinzufügen eines Zeichens an dem eingegebenem Wort, wurden die restlichen Zeilen undefiniert hinzugefügt. Und mit der zusätzlichen Eingabe von "= {} " an dem "char wort[50]", wurde es definiert.
    Wenn ich falsch liege, dann klär mich doch bitte auf, ich bin der Anfänger und du der Profi 🙂



  • Ich hoffe, dass das Folgende zu entziffern ist:

    char c[10];
    // Der Inhalt von c ist nicht definiert:
    {X} {X} {X} {X} {X} {X} {X} {X} {X} {X}

    -> Einlesen z.B. "Hallo":
    {H} {a} {l} {l} {o} {\0} {X} {X} {X} {X}
    -> ist nullterminiert.
    Dein stringlength würde jetzt 5 liefern.

    b an stelle 5 setzen (b ist 'A')

    {H} {a} {l} {l} {o} {A} {X} {X} {X} {X}

    Das heißt, die Nullterminierung würde überschrieben werden.
    Lösung, wie bereits geschrieben, den Rückgabewert speichern:

    {H} {a} {l} {l} {o} {\0} {X} {X} {X} {X}
    int len = stringlength(...); // 5
    c[len] = b;
    {H} {a} {l} {l} {o} {A} {X} {X} {X} {X}
    c[len+1] = '\0';
    {H} {a} {l} {l} {o} {A} {\0} {X} {X} {X}

    Hierbei (wie auch beim Einlesen) ist eigentlich noch peinlichst genau zu achten, dass nicht über die Arraygrenzen hinaus geschrieben wird.

    Mit
    char c[10] = { };

    werden alle chars mit 0 initialisiert:
    {\0} {\0} {\0} {\0} {\0} {\0} {\0} {\0} {\0} {\0}

    Daher klappt es auch und daher auch DirkBs Einwand, es noch einmal mit einem kürzeren String zu probieren.


Log in to reply