Wie wird mit einer nicht bekannten Größeneingabe in C gearbeitet?

Umgang mit Benutzereingaben unbekannter Größe in C

Hier sind zwei Beispiele für die Benutzereingabe in C.

1. scanf

Diese Methode ist leicht durch Pufferüberlauf anzugreifen. Versuchen Sie, einige Zeichen einzugeben, die über das hinausgehen, was Sie als Pufferüberlauf deklarieren.

#include
#include

int main()
{
    char bStr[80];
    printf("\nEnter a very very very long String value:");
    scanf("%s", bStr);
    printf("\nLong String value:%s \n\n",bStr);
    return 0;
}

2. fgets

Diese Methode kann den Pufferüberlauf schützen, indem die Benutzereingabe von Zeichen begrenzt wird.

#include
#include

int main()
{
    char bStr[80];
    printf("\nEnter a very very very long String value:");
    fgets ( bStr, 80, stdin );
    printf("\nLong String value:%s \n\n",bStr);
    return 0;
}

Die beiden oben genannten Methoden können jedoch nur normale Benutzereingaben verarbeiten:how about i want to handle user input with 1000 or even more characters? Ja, wir können wie "char bStr[1000]" oder noch größer deklarieren, aber dies ist nicht dynamisch und flexibel genug.

Lösung

Um dies zu beheben, wirdrealloc() verwendet, um die Speichergröße dynamisch zu erhöhen. Lassen Sie uns zuerst sehen, wie der Pufferüberlauf oben "scanf ()" aussieht. Geben Sie einfach mehr als das ein, was Sie deklarieren, und sehen Sie das Ergebnis unten.

image

Im folgenden Beispiel wird die dynamische Speicherzuweisung (Realloc) in C verwendet, um Benutzereingaben in unbekannter Größe zu verarbeiten.

#include
#include

int main()
{
    unsigned int len_max = 128;
    unsigned int current_size = 0;

    char *pStr = malloc(len_max);
    current_size = len_max;

    printf("\nEnter a very very very long String value:");

    if(pStr != NULL)
    {
    int c = EOF;
    unsigned int i =0;
        //accept user input until hit enter or end of file
    while (( c = getchar() ) != '\n' && c != EOF)
    {
        pStr[i++]=(char)c;

        //if i reached maximize size then realloc size
        if(i == current_size)
        {
                        current_size = i+len_max;
            pStr = realloc(pStr, current_size);
        }
    }

    pStr[i] = '\0';

        printf("\nLong String value:%s \n\n",pStr);
        //free it
    free(pStr);
    pStr = NULL;


    }
    return 0;
}

image

Fertig, jetzt kann das Programm Benutzereingaben unbekannter Größe problemlos verarbeiten.