Przychodzą mi do głowy dwa podejścia.
Po pierwsze, nie używaj scanf
. Użyj fgets()
which, który przyjmuje parametr do określenia rozmiaru buforu i pozostawia nienaruszone znaki nowej linii. Prosta pętla nad plikiem, który drukuje zawartość bufora, powinna naturalnie skopiować plik w stanie nienaruszonym.
Po drugie, użyj fread()
lub wspólnego idiomu C z fgetc()
. Przetwarzałyby plik w kawałkach o stałym rozmiarze lub pojedynczym znaku na raz.
Jeśli musisz przetworzyć plik na ciągach rozdzielonych spacjami, użyj albo fgets
albo, fread
aby odczytać plik i coś w rodzajustrtok
do podzielenia buforu na białe znaki. Nie zapomnij obsłużyć przejścia z jednego bufora do drugiego, ponieważ łańcuchy docelowe prawdopodobnie obejmują granicę bufora.
Jeśli istnieje wymóg zewnętrzny, którego należy użyć scanf
do wykonania odczytu, ogranicz długość ciągu, który może odczytać, za pomocą pola precyzji w specyfikatorze formatu. W twoim przypadku z 999-bajtowym buforem powiedz, scanf("%998s", str);
który zapisze maksymalnie 998 znaków w buforze, pozostawiając miejsce na terminator nul. Jeśli dozwolone są pojedyncze ciągi dłuższe niż twój bufor, musisz przetworzyć je na dwie części. Jeśli nie, możesz uprzejmie powiedzieć użytkownikowi o błędzie bez tworzenia luki w zabezpieczeniach związanej z przepełnieniem bufora.
Niezależnie od tego, zawsze sprawdzaj poprawność zwracanych wartości i zastanów się, jak radzić sobie ze złymi, złośliwymi lub po prostu źle sformułowanymi danymi wejściowymi.