2017-03-04 4 views
0

J'utilisais scanf pour toutes mes entrées en C. Maintenant, j'ai vu d'autres questions similaires sur scanf() et ils ont suggéré d'utiliser fgets() au lieu de scanf(). Je le ferai dans le futur. Cependant, à l'heure actuelle, cette partie du code avec scanf() ne semble jamais fonctionner. Je sais qu'il y a une solution.balayage d'une ligne de chaînes avec des espaces en utilisant scanf

Mon code est:

#define LENGTH 1000 
#define WORD 100 
int main(){ 
    int i = 0; 
    char s[WORD][LENGTH]; 
    do { 
     scanf("%s", s[i]); 
     i++; 
    } 
    while (s[i][strlen(s[i])] != EOF); 
    printf("%s\n", s); 

    return 0; 
} 

Il devrait y avoir quelque chose au lieu de EOF dans la boucle while qui vérifie la fin de la ligne. Le résultat final devrait être un tableau de mots dans s[] et le programme devrait imprimer ce tableau de mots sans espaces.

+0

Je suis tombé sur 'while (scanf ("% s ", & str [strlen (str)]) == 1)'. Je suis totalement nouveau ici. Comme l'a expliqué Iharob Al Asimi, c'est faux. Pouvez-vous, s'il vous plaît, expliquer pourquoi cette solution n'est pas correcte? ou pourquoi je ne peux pas l'utiliser dans mon code? –

Répondre

1

Malheureusement, scanf() ne lit pas le caractère que vous devez vérifier pour la fin de ligne, ou du moins n'utilise pas "%s" comme spécificateur.

Au lieu de cela, utilisez les éléments suivants

char line[100]; 
if (scanf("%99[^\n]", line) == 1) { 
    fprintf(stdout, "%s\n", line); 
} 

De cette façon, il ne se limite pas à des caractères blancs, et il se comporte comme fgets(), sauf qu'il ne lit pas le caractère '\n' et qui pourrait être un problème si vous l'appelez à nouveau.

+0

maintenant, je comprends scanf() a une utilisation très limitée. Est-il possible que mon code peut sortir de la boucle while avec des tableaux de chaînes stockés dans la mémoire? de sorte que je suis capable d'utiliser le tableau s [] plus tard dans le programme. –

+0

Vous pouvez utiliser la même astuce utilisée pour les chaînes, notez que votre question ne semble pas demander cela. La solution simple est de COMPTER LES MOTS et de garder une variable avec cette valeur afin de pouvoir l'utiliser plus tard. La solution compliquée est, utilisez des pointeurs et ajoutez un pointeur 'NULL' à la fin de votre tableau de mots, puis' for (int i = 0; s [i]! = NULL; ++ i) ... 'itérerait à travers tous les mots, la même chose faite pour les cordes. –

+0

Eh bien, j'ai trouvé une solution de travail pour scanf(): 'while (scanf ("% s ", & s [strlen (s)]) == 1);' Ceci assurera qu'une ligne complète est scannée jusqu'à 'entrer' –