Zwei Ansätze fallen mir ein.
Erstens nicht verwenden scanf
. Verwenden Sie fgets()
diesen Parameter, um die Puffergröße anzugeben und alle Zeilenumbrüche intakt zu lassen. Eine einfache Schleife über die Datei, die den Pufferinhalt druckt, sollte die Datei natürlich intakt kopieren.
Zweitens verwenden fread()
oder die gemeinsame C-Sprache mit fgetc()
. Diese würden die Datei in Blöcken fester Größe oder jeweils einem einzelnen Zeichen verarbeiten.
Wenn Sie die Datei über durch Leerzeichen getrennte Zeichenfolgen verarbeiten müssen, verwenden Sie entweder fgets
oder fread
, um die Datei zu lesen, und strtok
teilen Sie den Puffer in Leerzeichen. Vergessen Sie nicht, den Übergang von einem Puffer zum nächsten zu handhaben, da Ihre Zielzeichenfolgen wahrscheinlich die Puffergrenze überschreiten.
Wenn scanf
für das Lesen eine externe Anforderung erforderlich ist, begrenzen Sie die Länge der Zeichenfolge, die möglicherweise gelesen wird, mit einem Genauigkeitsfeld im Formatbezeichner. Sagen Sie in Ihrem Fall mit einem 999-Byte-Puffer, scanf("%998s", str);
der höchstens 998 Zeichen in den Puffer schreibt, und lassen Platz für den Nullterminator. Wenn einzelne Zeichenfolgen zulässig sind, die länger als Ihr Puffer sind, müssen Sie sie in zwei Teilen verarbeiten. Wenn nicht, haben Sie die Möglichkeit, den Benutzer höflich über einen Fehler zu informieren, ohne eine Sicherheitslücke für den Pufferüberlauf zu erstellen.
Überprüfen Sie unabhängig davon immer die Rückgabewerte und überlegen Sie, wie Sie mit fehlerhaften, böswilligen oder nur fehlerhaften Eingaben umgehen sollen.