Pb pour rentrer une chaine de caractere dans un tableau ! - C - Programmation
Marsh Posté le 10-04-2010 à 15:05:12
Lis la documentation de scanf(), en tapant "man scanf" en ligne de commande si tu es sur un unix quelconque, ou sinon dans google, ça fonctionne aussi.
Je copie-colle la partie qui nous intéresse :
Citation : Conversions |
Il faut voir scanf() comme une fonction de lecture de données formatées. Cette fonction est donc d'une part mal adaptée à la lecture de données brutes, et d'autre part très difficile à appréhender et à utiliser correctement pour les débutants (elle est bien plus complexe qu'il n'y paraît). Je rêve toujours de pouvoir brûler les professeurs qui commencent par cette fonction pour enseigner le C.
Essaie plutôt avec la fonction fgets(), bien plus simple à utiliser et adaptée à votre besoin :
http://www.linux-kheops.com/doc/ma [...] 3.txt.html
Marsh Posté le 10-04-2010 à 21:53:11
Déja merci bcp pour les réponses, malheuresement nous somme vraiment très très debutantes et nous avons bcp de mal a comprendre tout le langage !
Nous avons qd même essayé de modifier notre algo, voici ce que ca donne :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
int main()
{
int n;
char phrase [200];
printf ("Entrez le nombre de caracteres de votre phrase : " );
scanf ("%d",&n);
if ((n==0) || (n>200)) {
printf ("Entrez un autre nombre de caractere pour votre phrase" );
}
printf ("Entrez votre phrase : " );
scanf ("%s", phrase);
fgets (phrase, 200, stdin);
printf ("vous avez tape : %s", phrase);
return 0;
}
Nous avons quelques questions :
- Est ce que la fonction fgets doit remplacer la fonction scanf ? car si on enlève scanf et que l'on compile, nous n'arrivons plus à rentrer de phrase !
- A l'inverse si on laisse les deux fonctions, on peut rentrer une phrase mais le premier mot n'apparait pas !
Merci bcp !
Marsh Posté le 10-04-2010 à 23:23:27
Salut
C'est encore dû à scanf. Lors de la lecture du nombre de caractères. Il me semble qu'il ne prend pas le retour chariot du coup c'est fgets qui le lit et donc qui s'arrête là.
Il y a une astuce, un truc genre %*c mais le mieux c'est d'utiliser fgets() pour demander le nombre à l'utilisateur puis de convertir la chaîne de caractères obtenue en nombre avec strtol().
Marsh Posté le 11-04-2010 à 00:46:23
ton printf(phrase) c'est une TRES mauvaise idée. ne JAMAIS mettre en 1er parametre de printf un imput utilisateur, tu t'exposes a des mecs qui vont faire faire des printf("%n%n%n%n%n" ); a ton soft, ce qui va le faire planter dans la douleur et le sang. prefere un printf("%s\n", truc); ou encore mieux un puts(truc);
Marsh Posté le 11-04-2010 à 11:28:24
Quand tu fais:
Code :
|
Il reste un "\n" dans le buffer. Quand tu fais ensuite fgets, il voit ce "\n" et considère que c'est la chaine a lire, et retourne avec elle.
ca se voit très bien si tu remplace ton code par:
Code :
|
Il va donc falloir nettoyer stdin avant d'appeller fgets. Il semblerait logique de faire un fflush(stdin) avant le fgets, et ça marche très bien sous windows. MAIS, pour des raisons historiques, il ne faut pas faire fflush(stdin), car ça a un comportement indéfini [bon, ici ça marche, mais ça pourrait ne pas être le cas sous un autre environnement].
Donc il va falloir écrire une petite fonction de nettoyage:
Code :
|
et dans ton code, tu l'appèles après avoir lu stdin avec scanf:
Code :
|
et tout rentrera dans l'ordre.
La fonction de nettoyage de stdin lit tout ce qu'il reste dans stdin par tranches de 255 caractères ici, jusqu'a ce qu'il n'y ait plus rien ou bien que l'on ait (enfin) rencontré un '\n' (qui est alors a la fin de ce qu'on a lu par définition de fgets, d'ou le test junk_buffer[i-1] == '\n').
En résumé:
Code :
|
A+,
Marsh Posté le 10-04-2010 à 14:42:51
Bonjour à tous !
Nous avons un projet en algorithmique et programmation à réaliser pour notre école ! Nous devons créer un programme qui détermine le nb de couple d'anagramme par phrase! Pour cela on doit demander a l'utilisateur de rentrer le nb de caractères de sa chaine, dc jusque là pas de pb et ensuite créer un tableau en fonction du nb indiqué, afin dit mettre la phrase qu'on lui demandera par la suite!
Notre pb est le suivant : lorsque l'on rentre la phrase dans le tableau et que l'on affiche ensuite ce tableau seul le premier mot apparait et le reste disparait ! On ne sait pas du tout d'ou vient le pb car nous sommes vraiment très debutantes en programmation !
Voici la copie de l'ebauche de notre algo :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
int main()
{
int n;
char phrase [200];
printf ("Entrez le nombre de caracteres de votre phrase : " );
scanf ("%d",&n);
if ((n==0) || (n>200)) {
printf ("Entrez un autre nombre de caractere pour votre phrase" );
}
printf ("Entrez votre phrase : " );
scanf ("%s", phrase);
printf (phrase);
}
Par exemple si l'on rentre "la maison" seul le "la" apparait !
Si vous avez des suggestions !
Merci d'avance !