Deux approches viennent à l'esprit.
Premièrement, n'utilisez pas scanf
. Utilisez fgets()
qui prend un paramètre pour spécifier la taille du tampon, et qui laisse les caractères de saut de ligne intacts. Une simple boucle sur le fichier qui imprime le contenu du tampon devrait naturellement copier le fichier intact.
Deuxièmement, utilisez fread()
ou l'idiome commun en C avec fgetc()
. Cela traite le fichier par morceaux de taille fixe ou un caractère à la fois.
Si vous devez traiter le fichier sur des chaînes délimitées par des espaces blancs, alors utilisez soit fgets
soit fread
pour lire le fichier, et quelque chose comme strtok
pour diviser le tampon aux espaces blancs. N'oubliez pas de gérer la transition d'un tampon à l'autre, car vos chaînes cibles sont susceptibles de traverser la limite du tampon.
S'il existe une exigence externe d'utiliser scanf
pour la lecture, limitez la longueur de la chaîne qu'il pourrait lire avec un champ de précision dans le spécificateur de format. Dans votre cas avec un tampon de 999 octets, dites alors scanf("%998s", str);
ce qui écrira au plus 998 caractères dans le tampon laissant de la place pour le terminateur nul. Si des chaînes uniques plus longues que votre tampon sont autorisées, vous devriez les traiter en deux morceaux. Sinon, vous avez l'opportunité d'informer poliment l'utilisateur d'une erreur sans créer de faille de sécurité de débordement de tampon.
Quoi qu'il en soit, validez toujours les valeurs de retour et réfléchissez à la manière de gérer les entrées incorrectes, malveillantes ou simplement mal formées.