Dynamisches Array mit getche()



  • Hallo Leute.
    Ich möchte das für eine Zeichenkette immer genausoviel Speicher reserviert wird
    wie gerade notwendig. Wenn z.B nur ein Zeichen eingegeben wird soll auch Speicher nur für ein Zeichen reserviert werden.
    Ich habe das bis jetzt so verwirklicht:

    char *array, c, i=0;
    
    if((array = (char*)calloc(1, sizeof(char))) == NULL)
    {
        printf("Speicherfehler.");
        exit(1);
    }
    else
    {
        c = getche();
        while(c!='\n')          //Eingabe läuft bis Return gedrückt wird
        {
            if((array = (char*)realloc(array, (i+1)*(sizeof(char)))) == NULL)
            {
    	        printf("Speicherfehler.");
                exit(1);
            }
            else
            {
                array[i] = c;
                i++;
                c = getche();
            }
            array[i] = '\0';    //Abschlusszeiche an das Ende des Strings setzen
        }
    }
    

    Jetzt ist die Sache, das wenn ich bei der Eingabe mit den Pfeiltasten vor- oder
    zurück gehen möchte, getche() das auch als Zeichen sieht. Das wird dann natürlich auch im array gespeichert.

    Wie könnte man das machen, dass man bei der Eingabe mit den Pfeiltasten hin- und her scrollen kann? Ohne dass die im array abgespeichert werden?



  • Vorschlag Nutze fgets
    Dazu öffneest dur dir am Anfang der Routine ein Buffer z.B. mit 512 Zeichen, In diesen liest du mit fgets die Eingabe. Bestimmst dann die Länge des gelesenen Strings. Allokierst dir entsprechend den Speicher dynamisch (inklusive der schliesenden 0) und kopierst den Inhalt des Buffers in diesen String. Danach setzt du den Buffer auf leer.



  • PAD schrieb:

    Danach setzt du den Buffer auf leer.

    Einfach buffer=0; oder wie geht das?



  • wenn dein Buffer

    char buffer[512];

    dann setzt du diesen Buffer auf leer mit

    buffer[0]=0x00;
    

    Auf leer setzen heisst, du nträgst die Stringende kennung \0 in das erste element des Buffers ein



  • Noch was: bei meinem Code prüfe ich in der While-Schleife noch zusatzlich auf Escape eingabe. Damit man die Engabe jederzeit verlassen kann.

    while((c!=13) && (c!=27))  //13 ist <Return>  27 ist <ESC>
    {
        .....
    }
    

    Bei gets() geht das nicht. Man kann die Eingabe nur durch return verlassen. Dann wird das aber abgespeichert, und das soll es nicht, wenn ich abbrechen will.



  • Das ist ein Nachteil von gets.

    Lösungsansatz:
    Wenn im einen eingegebenen String ESC vorkommt so wird abgebrochen bevor umkopiert wird. Das hat zwar den Nachteil das man zumindest esc cr eingeben muß. Aber es würde funktionieren.



  • Was meinst du mit

    PAD schrieb:

    Lösungsansatz:
    das man esc cr eingeben muss.

    was ist esc cr? Wie gibt man das ein? wieso "cr"?



  • esc ist dein ESC
    cr ist dein return als Abkürzung für carriage return

    //13 ist <Return> 27 ist <ESC>



  • Ja, stimmt. Bei mir wäre das aber eine Null-Eingabe, und wenn das passiert fragt er nochmal nach dem String. Geht bei mir also nicht. 😞



  • Ich versuche es jetzt mit getch() und putchar().



  • wieso ist ESC return eine Nulleingabe, es müsste ein String mit einem Zeichen sein nämlich ESC



  • getch() und getche() verarbeiten Sondertasten wie zB ESC etwas anders:

    ESC besteht dann aus 2 Zeichen. Das Erste ist ein Steuerzeichen, das anzeigt, dass eine Sondertaste gedrückt wurde. Das Zweite ist dann der Code für die ESC-Taste.

    Welches Zeichen das 'Steuerzeichen' ist, hängt vom Compiler ab (irgendwo im Konsolen-Forum sollte etwas darüber zu finden sein)

    uU ist bei dir dieses Steuerzeichen 0?


Anmelden zum Antworten