На ум приходят два подхода.
Во-первых, не используйте scanf
. Используйте fgets()
который принимает параметр, чтобы указать размер буфера, и оставляет любые символы новой строки нетронутыми. Простой цикл над файлом, который печатает содержимое буфера, должен, естественно, скопировать файл без изменений.
Во- вторых, использование fread()
или общий C идиомы с fgetc()
. Они будут обрабатывать файл кусками фиксированного размера или по одному символу за раз.
Если вы должны обработать файл поверх строк, разделенных пробелами, используйте либо, fgets
либо, fread
чтобы прочитать файл, и что-то вроде strtok
разделения буфера на пробелы. Не забывайте обрабатывать переход от одного буфера к другому, так как ваши целевые строки, вероятно, будут выходить за границы буфера.
Если есть внешнее требование для использования scanf
для чтения, ограничьте длину строки, которую она может прочитать, с помощью поля точности в описателе формата. В вашем случае с 999-байтовым буфером скажите, scanf("%998s", str);
который будет записывать не более 998 символов в буфер, оставляя место для нулевого терминатора. Если разрешены отдельные строки длиннее, чем ваш буфер, вам придется обрабатывать их двумя частями. Если нет, у вас есть возможность вежливо сообщить пользователю об ошибке, не создавая бреши в защите от переполнения буфера.
В любом случае всегда проверяйте возвращаемые значения и думайте о том, как обрабатывать неверный, злонамеренный или просто искаженный ввод.