2009-06-04 9 views
1

char first [10];fscanf - utilisation d'une chaîne trop longue

char second [10];

Que fait fscanf (fr, "% s% s \ n", premier, deuxième); faire quand la première chaîne est trop longue?

Puis-je utiliser simplement char * first sans malloc? et le pointeur montrera à la chaîne?

Répondre

3

Vous pouvez utiliser une largeur (c'est-à-dire "% 9s") pour limiter la taille de la chaîne. Par exemple, voir Microsoft's documentation.

L'utilisation d'un pointeur sans l'initialiser à quoi que ce soit est un moyen sûr de faire planter votre programme ou de mal se comporter.

+0

mais je peux avoir une chaîne plus petite que 10. Dans ce cas, je ne comprendrais pas tout. – feiroox

+1

De la documentation: "Il est possible de lire moins de caractères de largeur si un caractère d'espace (espace, tabulation ou nouvelle ligne) ou un caractère qui ne peut pas être converti selon le format donné est atteint avant que la largeur soit atteinte." –

+1

Encore une chose - la largeur donnée à fscanf doit être inférieure de un à la taille de la chaîne, pour permettre le terminateur nul. Je vais mettre à jour mon exemple. –

1

Lorsque la première chaîne est trop longue, vous rencontrez un problème d'un buffer overflow.

Quant à la deuxième partie de votre question, si vous ne l'utilisez malloc, alors il pointera à la mémoire des ordures. Il est possible que la chaîne reste là pendant un certain temps, mais ce n'est pas garanti, et si ce segment de mémoire est utilisé par autre chose, vous perdrez votre chaîne.

2

Si vous utilisez la glibc, vous pouvez résoudre les deux problèmes en une seule fois - utilisez le spécificateur de format %as.

Il alloue automatiquement une chaîne suffisamment grande pour contenir le contenu.

Comme ceci:

char *first, *second; 

scanf(fp, "%as %as\n", first, second); 

Note: Ceci est l'extension GNU!

+0

Salut merci. c'est dommage que ce ne soit pas sous windows :) – feiroox

Questions connexes