Dynamischer String



  • Hallo,
    ich würde gerne einen String anlegen, der dynamischer in seiner Speichergröße vom Benutzer gewählt werden kann.

    char *satz;
        int length;
    
       printf("Wie lang soll Ihr Satz sein?");
        scanf("%d", &length);
        satz = (char *) malloc(sizeof(*satz) * length);
    
        printf("Bitte geben Sie den unverschluesselten Satz ein:\n");
        fgets(satz,length,stdin);
    

    er überspringt jedoch das fgets jedes mal und ich kann den satz nich eingeben. wieso das?



  • Weil beim scanf zwar die von dir eingegebene Länge lesen und somit vom Eingabepuffer entfernt wird, aber das '\n' im Puffer bleibt. Das darauffolgende (f)gets konsumiert es bevor du noch etwas eingeben kannst. Also ein eventuelles Newline vor (f)gets aus dem Puffer lesen und verwerfen.

    // deutsche Sprache ...



  • Die Frage wäre ein Grund, die Möglichkeiten der string-Klasse von C++ anzusehen. Es muss ja nicht alles strikt native-C bleiben, was man so benutzt! 🙂



  • berniebutt schrieb:

    Die Frage wäre ein Grund, die Möglichkeiten der string-Klasse von C++ anzusehen. Es muss ja nicht alles strikt native-C bleiben, was man so benutzt! 🙂

    C forum 😕



  • hazZ22121 schrieb:

    er überspringt jedoch das fgets jedes mal und ich kann den satz nich eingeben. wieso das?

    Der Code sieht OK aus, aber besser noch bei malloc +2 spendieren, für '\0' und '\n'.
    fgets "übergeht" nichts, evtl. schließt dein Konsolenfenster beim Testlauf am Programmende automatisch und du glaubst, fgets "übergeht" hier was.



  • hazZ22121 schrieb:

    er überspringt jedoch das fgets jedes mal und ich kann den satz nich eingeben. wieso das?

    Swordfish schrieb:

    [...]

    .



  • sizeof(*satz)
    

    muss meiner Meinung

    sizeof(char)
    

    heißen. char *satz ist ein unvollständiger Datentyp, d. h., seine Länge ist undefiniert. satz ist ein undefinierter Zeiger der prozessorabhängigen Länge.

    Das malloc muss mindestens mit sizeof(char)*length+1 aufgerufen werden. In einer ASCII-Umgebung kann sizeof(char) entfallen, da es 1 ist.

    Stimmt es wirklich, dass scanf die Zeilenschaltung in einem String mit abspeichert? Ich dachte immer, es entfernt die Zeilenschaltung aus dem Eingabestrom und schreibt stattdessen ein Abschlusszeichen '\0' in den Empfangspuffer. Dabei überfährt es durchaus locker den tatsächlichen Puffer, wenn man nicht das sichere scanf_s benutzt.

    Ist der Empfänger eine Zahl und die Eingabe fehlerhaft, dann werden alle numerischen Zeichen entfernt, während das falsche und alle folgenden Zeichen im Eingabestrom verbleiben.



  • Waldschrat schrieb:

    sizeof(*satz)
    

    muss meiner Meinung

    sizeof(char)
    

    heißen.

    Ist völlig gleich. Wenn der Operand von sizeof ein Ausdruck ist, wird er nicht ausgewertet.

    Waldschrat schrieb:

    char *satz ist ein unvollständiger Datentyp, d. h., seine Länge ist undefiniert.

    Falsch. Die Größe des Zeigers steht zur Compilezeit fest.

    Waldschrat schrieb:

    satz ist ein undefinierter Zeiger der prozessorabhängigen Länge.

    Für sizeof ist nur der Typ des Operanden interessant.

    Waldschrat schrieb:

    In einer ASCII-Umgebung kann sizeof(char) entfallen, da es 1 ist.

    sizeof(char) ist immer 1. Was bitte ist eine "ASCII-Umgebung"?


Anmelden zum Antworten