Se connecter avec
S'enregistrer | Connectez-vous

Recuperer la 1ere lettre d'un mot

Dernière réponse : dans Programmation

Bonjour , je cherche a récupérer la premiere lettre d'un mot entré par l'utilisateur.

j'ai donc :

  1. void recup() {
  2.  
  3.  
  4. char nomajout[50];
  5. char lettre[1]; //inutil...
  6.  
  7. purger();
  8. printf("Entrer le mot: ");
  9. fgets(nomajout, sizeof(nomajout), stdin);//recuperation de la saisie complete de l'utilisateur au clavier
  10. clean(nomajout);
  11.  
  12. strncpy(lettre,nomajout,1);
  13.  
  14. printf("%s",lettre);
  15.  
  16. }


La fonction purger et clean donc des fonctions permettant mettre des mots avec espace.

Je debute en C et cette fonction NE FONCTIONNE PAS.

Quelqu'un a une idée ?

merci

Autres pages sur : recuperer lettre mot

Lassé par la pub ? Créez un compte
Expert Programmation

Oui, j'ai une idée.
Commence par déclarer assez de place dans ton buffer lettre. Je te rappelle qu'une chaîne à zéro terminal contient tous les caractères utiles plus un zéro terminal.
Pour mettre au maximum n caractères, il faut donc réserver n+1 caractères :
  1. char lettre[2]; // pour 1 caractère max.


Attention aux fonctions strn*. Si on est aux limites des buffers, le zéro terminal n'est pas implicite. Il faut penser à le forcer avant ou après :
  1. lettre[1] = '\0'; // puriste
  2. lettre[ sizeof(lettre) / sizeof(*lettre) - 1 ] = 0; // guru


Alors, ça marche toujours pas ?
Alors vire aussi le clean de la ligne 10, pour gérer un problème à la fois.

---------------------------------

Personnellement, quand j'utilise de tous petits buffers comme ça, je les initialise avec des X, par exemple. C'est plus facile à dégugger, d'une part, et je n'oublie pas le zéro final car il est ajouté implicitement :
  1. char petit_buffer[5] = "XXXX";

Après un tel code, les quatre premiers octets sont à X, le 5ème à 0.
Je me permets même ce type de syntaxe :
  1. char petit_buffer_pour 4_chars[] = "XXXX";

Le compilateur compte lui-même les octets nécessaires. C'est très visuel et je ne peux pas me tromper ;)  Par contre, ce n'est vraiment que pour les tout petits buffers, tu l'as bien compris.


---------------------------------

Au fait, une autre façon d'afficher le premier caractère d'un buffer :
  1. char buff[] = "muse";
  2. printf("Première lettre : <%c>", buff[0]);
  3. // On ne tombe pas toujours sur des buffers bien remplis :
  4. printf("Première lettre : '%c' 0x%X", buff[0], buff[0]);


Bon apprentissage du C :) 

Merci beaucoup ! Et dsl pour la réponse tardive ! Je suis donc bein debloqué...mais un nouveau probleme se pose a moi !
EN fait :
Je creé une liste chainée , je récupère les noms de chaque listes et j'aimerai qu'il me retour un tableau contenant les premières lettres manquantes. C'est un peu complexe ce que je veux faire, mais c'est pour bien comprendre les listes chainées et les boucles.

Un exemple :
je rentre : poulet , riz , oignon, vin , biere
Et la console me sort : a c d e f g h i j k l m n q s t u w x y z

j'ai donc ecri ça :

  1. void compare (produit *liste) {
  2.  
  3. char nom[50];
  4. char lettre;
  5. int i=0;
  6. int j=0;
  7. int m=0;
  8. int n=0;
  9. char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
  10. char alphafinal[50];
  11.  
  12. while(liste!=NULL){ // recuperation de chaque premiere lettres des produits.
  13. nom[i]= liste->nom[0];
  14. i+=1;
  15. liste=liste->suiv;
  16. }
  17. for (i=0;i<26;i++) { // le prob est dans cette boucle
  18. if (alphabet[i] != nom[i]) {
  19. alphafinal[j] = alphabet[i];
  20. j+=1;
  21. }
  22. }
  23.  
  24. for (m=0; m<j; m++) {
  25. printf("%c",alphafinal[m]);
  26. }
  27. }


merci de votre aide :) 
Expert Programmation

Le problème est bien dans la boucle de la ligne 17.
Puisque c'est un exercice, je te laisse chercher un peu, avec cet indice : il te faut une double-boucle imbriquée pour parcourir les deux tableaux alphabet et nom.

N'hésite pas à poser plus de questions ;) 
Expert Programmation

ça me rappelle ma jeunesse, quand j'écrivais mes premiers programmes... :love: 

Quand tu auras corrigé ton code grâce à l'indice laissé par zeb, tu pourras réaliser deux autres petits exercices amusants:

1. remplacer les 3 tableaux "nom", "alphabet" et "alphafinal" par un seul tableau à 2 dimensions (ce qui fera un code plus élégant).

2. Remplacer le tableau à deux dimensions par un tableau ordinaire (pas forcément plus élégant ni plus simple, mais plus sioux)...

EDIT: Et pour le deuxième exercice, il y a au moins deux solutions possibles... ;) 
Expert Programmation

^^ Y'a pleins de ptits trucs à dire ou à faire faire à un d'jeun qui s'y met.

Si l'alphabet est un exemple, c'est bien. Si c'est vraiment l'itération de a à z qui l'intéresse, on pourrait lui dire de l'écrire comme ça :
  1. for (i='a';i<='z';i++)


On peut lui demander de se mettre d'accord sur l'incrémentation.
Ligne 14 : i+=1;
Ligne 17 : i++

Argfffff!! Pis aussi de vérifier dans la boucle de la ligne 12 qu'on n'a pas dépassé 50. Ça, c'est quand même le plus important. (T'as qu'à rendre un truc comme ça à un prof ou à un patron, ça va barder !)

Ah c'était le bon temps ^^
Expert Programmation

zeb a dit :
On peut lui demander de se mettre d'accord sur l'incrémentation.
Ligne 14 : i+=1;
Ligne 17 : i++

Je suis presque sûr qu'il fait toujours les incrémentation en "i+=1" dans le code. Les "i++", il ne les met que dans les boucles "for" parce que c'est comme ça qu'il a appris à les utiliser. Il apprendra vite à bricoler dans les paramètres du "for"... C'est juste un coup à prendre. ;) 

zeb a dit :

Argfffff!! Pis aussi de vérifier dans la boucle de la ligne 12 qu'on n'a pas dépassé 50. Ça, c'est quand même le plus important. (T'as qu'à rendre un truc comme ça à un prof ou à un patron, ça va barder !)

Erreur classique du débutant d'oublier de tester l'arrivée en fin de tableau... :D 

Soit dit en passant, le "programme" entier pourrait se coder avec un seul tableau de 26 entiers... :sol: 

Mais j'en ai déjà trop dit: faut qu'il bosse un peu le petit... :p 

EDIT: Et si on cherche la petite bête, on pourrait aussi remarquer que les variables "lettre" et "n" ne sont pas utilisées et que "alphafinal" n'a pas besoin d"une taille supérieure à 27...

Bon...
  1. void compare (produit *liste) {
  2.  
  3. char nom[50];
  4. int i=0;
  5. int j=0;
  6. int m=0;
  7. int n=0;
  8. char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
  9. char alphafinal[50];
  10.  
  11. while(liste!=NULL){ // recuperation de chaque premiere lettres des produits.
  12. nom[i]= liste->nom[0];
  13. i+=1;
  14. liste=liste->suiv;
  15. }
  16. for (i=0;i<=25;i++) {
  17. for (j=0; j<=3 /*strlen(nom) ne fontcionne pas) */ ; j++) {
  18. if (alphabet[i] != nom[j] && alphabet[i] != alphafinal[n]) { //fait n'importe quoi....
  19. alphafinal[n]= alphabet[i] ;
  20. n+=1;
  21. }
  22. }
  23. }
  24.  
  25. for (m=0; m<n; m++) {
  26. printf("%c",alphafinal[m]);
  27. }
  28. }


Et ça fait n'importe quoi...je comprend pas bien là. :( :( :( 
Expert Programmation

Je confirme: ça fait n'importe quoi! :D 

Je vais te donner un petit truc: essaie toujours d'expliquer en français ce que fait ton code. C'est parfois très instructif.

Là, par exemple, ton code pourrait s'expliquer ainsi:

"On met dans le tableau "nom" les premières lettres des mots de la liste.
Puis, on compare chaque lettre de l'alphabet à chacune des premières lettres de la liste.
Pour chaque lettre de la liste, si elle elle différente de la lettre de l'alphabet actuellement observée et si elle est différente de la prochaine case à remplir du tableau résultat, alors on copie la lettre de la liste dans le tableau résultat et on passe à la case suivante..."

Rien ne te choque?

Le résultat est que tu copies chaque lettre de l'alphabet dans la liste finale autant de fois qu'elle est comparée à une lettre de la liste qui n'est pas identique. :/ 

Et le deuxième test ne sert à rien car tu compare la lettre de l'alphabet à une case du tableau de résultat qui est toujours vide... En effet, chaque fois que tu mets une lettre dans ce tableau, tu incrémentes "n"... :sarcastique:

Tu mets tellement de lettres dans ton tableau résultat que tu dois déborder de sa taille (d'autant plus que tu ne vérifies pas le non-débordement...)

Il faut que tu compares chaque lettre de l'alphabet à chacune des lettres de ta liste, certes, mais tu ne dois pas remplir le tableau résultat avant d'avoir fini de comparer toutes les lettres de la liste. Pour cela, utilise par exemple un booléen. Il changera de valeur si une des lettres de la liste est identique à la lettre de l'alphabet. Une fois toutes les lettres de la liste testées, si le booléen n'a pas changé alors la lettre de l'alphabet peut être mise dans le tableau résultat...

Accessoirement, limiter la recherche dans le tableau "nom" aux quatre première cases
est très sale... :non: 

Surtout que ne vois pas où est ton problème: le nombre de lettres contenues dans le tableau "nom", et bien tu l'avais déjà dans une variable: pourquoi ne pas le conserver...

Je pense que tu en sais maintenant assez pour corriger ton code... ;) 
Expert Programmation

zeb a dit :
Attention aux fonctions strn*. Si on est aux limites des buffers, le zéro terminal n'est pas implicite. Il faut penser à le forcer avant ou après :
  1. lettre[2] = '\0'; // puriste
  2. lettre[sizeof(lettre)] = 0; // guru
Roh, et y a personne pour relever ça ...

c'est lettre[1] qu'il faut modifier, ou lettre[sizeof lettre/sizeof lettre[0]-1]
Lassé par la pub ? Créez un compte