programme

programme - C - Programmation

Marsh Posté le 09-08-2006 à 13:46:27    

Bonjour,
 
j'aimerais savoir comment inverser les mots d'une phrase dans un programme
 
si la phrase est " aujourd'hui le soleil brille" on doit obtenir "brille soleil le aujourd'hui "
 
merci

Reply

Marsh Posté le 09-08-2006 à 13:46:27   

Reply

Marsh Posté le 09-08-2006 à 13:49:50    

Ben tu lis ta chaîne, tu la découpes suivant un séparateur (ici, l'espace), et tu parcours ensuite ton découpage de la fin jusqu'au début pour reconstruire une nouvelle chaîne, mais à l'envers.
 
De rien. [:el g]

Reply

Marsh Posté le 09-08-2006 à 14:17:52    

Voir strtok


---------------
Töp of the plöp
Reply

Marsh Posté le 09-08-2006 à 14:20:58    

Pas l'idéal pour lire ensuite une chaîne à l'envers, vu que ça y colle des '\0' au fur et à mesure. :/
 
J'pensais plutôt à strrchr(), c'est pas plus compliqué à utiliser dans ce cas précis.

Reply

Marsh Posté le 09-08-2006 à 14:28:04    

Ouais moi je pensais à mettre les mots dans un tableau et reparcourir le tableau ...
 
Enfin bref.


---------------
Töp of the plöp
Reply

Marsh Posté le 09-08-2006 à 15:06:17    

Ben ouais mais ça oblige à utiliser les listes chaînées (parce qu'un tableau faut le gérer vu qu'on n'en connait pas la taille avant d'interpréter la ligne de données), c'est assez lourd même si c'est facile à mettre en place.
 
Avec ma méthode, on reconstruit la chaîne finale tout en lisant la chaîne initiale, en une seule passe. Ca se fait en trois-quatre ligne dans une boucle while(). [:spamafote]


Message édité par Elmoricq le 09-08-2006 à 15:07:39
Reply

Marsh Posté le 09-08-2006 à 15:14:42    

ah oui c'est vrai qu'en C on a pas les vector :D


---------------
Töp of the plöp
Reply

Marsh Posté le 09-08-2006 à 15:23:03    

Je suis débutant en c...alors si vs pouviez faire un petit exemple...c'est tjs plus parlant :)

Reply

Marsh Posté le 09-08-2006 à 15:39:19    

Comme le suggère Elmoricq, puisque sa solution est effectivement la plus simple à mettre en oeuvre:
 
- Tu utilises strrchr (voir doc) pour trouver les emplacement des " ".
- A partir de ces emplacements, tu peux parcour ta chaine initiale en regressant : tu pars du premier espace jusqu'à 0, tu sauvegardes ton index, tu cherches le second espace, tu reparcours ta chaine initiale du second espace jusqu'à l'index et ainsi de suite. Parallèlement au parcours, tu copie les caractères lu dans une chaine cible
- et c'est fini


---------------
Töp of the plöp
Reply

Marsh Posté le 18-08-2006 à 15:37:24    

voici une petite fonction qui pourra t aider ... je m en sers plus depuis longtemps. Cette fonction stocke une chaine de caracteres dans un tableau de chaines de caracteres en fonction d un char delimiteur (char div --> ' ' dans ton cas) et te renvoie le tableau.
 

Code :
  1. char    *get_begin(char *s, char div)
  2. {
  3.   while (*s && (*s == div || *s == ' '))
  4.     s++;
  5.   return (s);
  6. }
  7. char    *get_end(char *s, char div)
  8. {
  9.   while (*s && *s != div)
  10.     s++;
  11.   return (s);
  12. }
  13. char    **my_str_to_wordtab(char *str, char div)
  14. {
  15.   char  *s;
  16.   char  *fin;
  17.   int   count;
  18.   char  **tab;
  19.   if (!str)
  20.     return (0);
  21.   for (s = get_begin(str, div), count = 0; *s; count++)
  22.     {
  23.       s = get_end(s, div);
  24.       s = get_begin(s, div);
  25.     }
  26.   tab = malloc((count + 1) * sizeof(fin));
  27.   for (s = get_begin(str, div), count = 0; *s; count++)
  28.     {
  29.       fin = get_end(s, div);
  30.       tab[count] = my_strndup(s, fin - s);
  31.       s = fin;
  32.       s = get_begin(s, div);
  33.     }
  34.   tab[count] = 0;
  35.   return (tab);
  36. }

Reply

Marsh Posté le 18-08-2006 à 15:37:24   

Reply

Marsh Posté le 20-08-2006 à 01:01:43    

Ç'aurait été bien que tu testes le retour de malloc.

Reply

Marsh Posté le 20-08-2006 à 01:08:43    

on donne pas de solutions toutes cuites svp. surtout bugguées et incomplètes.

Reply

Marsh Posté le 20-08-2006 à 09:26:34    

Taz a écrit :

on donne pas de solutions toutes cuites svp. surtout bugguées et incomplètes.


 [:figti]  
Bon ca fait 4 ans que je n'ai pas fait de C. Ceci dit j'ai du mal à comprendre tes propos, à priori ça à l'air de marcher. Où est l'erreur et qu'est-ce qui manque ?  :heink:


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 20-08-2006 à 17:01:40    

Bah rien que  my_strndup et le fait que tu ne testes pas le retour de malloc donc.


---------------
Töp of the plöp
Reply

Marsh Posté le 20-08-2006 à 17:23:57    

_darkalt3_ a écrit :

Bah rien que  my_strndup et le fait que tu ne testes pas le retour de malloc donc.


ben je suppose que "my_strndup" ajoute un caractère de fin, quand au retour du malloc, entre un message d'erreur ou un crash brutal, ca change quoi ?


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 20-08-2006 à 18:12:07    

Giz a écrit :

ben je suppose que "my_strndup" ajoute un caractère de fin, quand au retour du malloc, entre un message d'erreur ou un crash brutal, ca change quoi ?


Le gens qui aiment les choses bien faites préfèrent le message d'erreur et la sortie propre, les autres feront une daube inutilisable.
 
Enfin, ne poster qu'une partie de la solution ne doit pas vraiment aider.


---------------
Töp of the plöp
Reply

Marsh Posté le 20-08-2006 à 18:54:56    

Giz a écrit :

ben je suppose que "my_strndup" ajoute un caractère de fin, quand au retour du malloc, entre un message d'erreur ou un crash brutal, ca change quoi ?

A mon avis, my_strndup effectue une sauvegarde de la chaîne passée en argument, et ceci entre les adresse s et fin-s, comme quoi...
Maintenant entre un programme critique qui fera un log signalant un problème mémoire et continuera à fonctionner tout de même de manière un peu dégradée et un programme qui crashera bloquant tout un process qu'est-ce qu'il y a de mieux ?
J'exagère à peine.

Reply

Marsh Posté le 20-08-2006 à 20:15:23    

Sans compter que c'est un brin inutilement compliqué comme programme, pour la tache à effectuer. [:mlc]

Reply

Marsh Posté le 20-08-2006 à 20:28:31    

Elmoricq a écrit :

Sans compter que c'est un brin inutilement compliqué comme programme, pour la tache à effectuer. [:mlc]


 
c'est clair :o

Reply

Marsh Posté le 20-08-2006 à 20:50:38    

Elmoricq a écrit :

Sans compter que c'est un brin inutilement compliqué comme programme, pour la tache à effectuer. [:mlc]


 
c'est pas faux, mais c'est du C aussi : en dessous de 30 lignes de code, tu codes aucun algo :/.
Sinon comparer avec la valeur 0 pour un pointeur c'est cracra :o
 

Citation :

Note that using the integer 0 as the terminator would not have been portable: on some imple-
mentations, the integer zero and the null pointer do not have the same representation.
 
Bjarne Stoustrup - The C++ programming langage 3rd Edition


 
 :sol:  


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 21-08-2006 à 00:25:16    

Attention, Bjarne Stroustrup parle du C++, pas du C.
Mais il est vrai que NULL est défini dans stddef.h et peut varier d'une implémentation à l'autre.

Reply

Marsh Posté le 21-08-2006 à 14:27:56    

j ai donné fonction car elle je l ai codé pour qu'elle soit le plus generique possible (elle permet de parser a peu pres toutes chaines de caracteres en fonction d un caractere delimiteur).
 
desole de ne pas avoir verifier la valeur de retour de mon malloc mais cette fonction a 4 ans et je debutais a l epoque en C ... j avais pas encore tous les automatisme.
 

Citation :

on donne pas de solutions toutes cuites svp. surtout bugguées et incomplètes.


 
j ai pas donné de solution toute cuite ... j ai juste donné une fonction qui pourrait l aider, un exemple vaut mieux qu un long discours. Bugguées ??? dis moi ou tu as vu un bug ...
 
petite precision pour my_strndup -> cette fonction prend en parametre un pointeur sur la chaine de caracteres et le nombre de caracteres (n) a copier puis alloue n+1 caracteres, duplique le morceau de chaine en ajoutant le '\0' a la fin, et enfin retourne la chaine dupliquée.

Message cité 1 fois
Message édité par doton le 21-08-2006 à 14:56:17
Reply

Marsh Posté le 21-08-2006 à 14:30:59    

doton a écrit :

j ai juste donné une fonction qui pourrait l aider


 
 [:uxam]


Message édité par Elmoricq le 21-08-2006 à 14:31:12
Reply

Marsh Posté le 21-08-2006 à 17:03:38    

Citation :

Enfin, ne poster qu'une partie de la solution ne doit pas vraiment aider.


en meme temps avec ce que j ai donné, la solution n est pas difficile a trouver ... il suffit juste de parcourir le tableau retourné en partant de la fin et d afficher les mots un par un dans une boucle en ajoutant les espaces manquants

Reply

Marsh Posté le 24-08-2006 à 13:22:11    

kiooik a écrit :

j'aimerais savoir comment inverser les mots d'une phrase dans un programme

Quelle est ta question sur le langage C ?
Tu as oublié de poster le code avec lequel tu as un problème.
 
Pour les questions d'algorithmes, voir le forum ALGO, mais ton cas est un peu élémentaire...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed