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