2012-02-02 2 views
0

J'ai un problème avec mon code: Je dois l'écrire pour pouvoir insérer la description d'un mot. Je suis en train de tordre le code pour un dictionnaire et voici le problème: quand je démarre le programme, la console lit seulement le premier mot et ignore les autres. par exemple. si j'écris "Cela signifie bla", il ne lira que "Ceci".Lecture des espaces en C

J'utilise ce code:

char *Description; 
scanf("%s", Description); 
strcpy(word[i].description,Description); 

.description est également une chaîne dans une structure ont été la description doivent être enregistrées également.

Répondre

2

Tout d'abord, vous n'avez alloué aucune mémoire à Description.

Deuxièmement, scanf %s s'arrête à des espaces. Vous pouvez utiliser fgets à la place:

fgets(word[i].description, LEN, stdin); 

Ou peut-être:

scanf("%99[^\n]", word[i].description); 
+0

Tout ce qui précède est correct. Une autre solution est d'utiliser gets (word [i] .description) – brano

+0

je pensais déjà que le problème était le scanf% s maintenant j'essaye avec% 99 [^ \ n] mais quand je démarre le prog il saute simplement le scanf et allez-y ..... –

+0

n'utilisez jamais gets(). il ne fait pas de vérification des limites de portée, donc c'est une porte ouverte pour chaque attaquant. –

2

Vous ne pouvez pas lire dans un pointeur, le pointeur doit pointer d'abord à la mémoire inscriptible. Bien sûr, vous avez un problème ici d'avoir aucune idée d'allouer, mais disons que nous décidons 2048.

char Description[2048]; 
scanf("%s", Description); 

cela fonctionnera aussi longtemps que la chaîne étant tapé ne dépasse pas 2047 caractères. (Il en faut un de plus pour le terminateur null).

Vous pourriez utiliser get au lieu de scanf, mais vous auriez un problème similaire.

Celui sûr à utiliser ici est fgets

char Description[32]; // or whatever size you think is adequate 
fgets(Description, sizeof(Description), stdin); 

Le nombre de caractères est limité. Notez que le caractère null-terminator sera inclus pour vous, de sorte que la longueur maximale de la chaîne que vous recevrez sera de 31 caractères. Scanf est une lecture plus sûre des nombres, car ceux-ci sont de taille fixe.

+0

Ty j'ai utilisé fgets() mais d'abord besoin d'utiliser fflush (stdin) fonctionne maintenant bien. Je sais que cette fonction n'est pas utilisée en raison du problème de débordement, mais il s'agit d'un projet pour l'université, il ne doit fonctionner qu'une seule fois: D –

+0

scanf peut être utilisé pour les données numériques car ce problème ne se produit pas. Vous devez vérifier le résultat de scanf dans ce cas, car si les données n'étaient pas valides, vos données n'auront pas été écrites. – CashCow