Extraction des mots d'une phrase

Fermé
mimi - 22 févr. 2014 à 17:14
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 24 févr. 2014 à 17:46
salut tous le monde
je suis très débutante en c et j'ai besoin de corriger ma faute..
j'écris un petit programme qui découpe une phrase en des mots et celui ça marche bien mais le problème est que j'ai besoin de remplir ces mots dans un tableau.
Merci bien d'avance.. voila mon code :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define N 1000000


void main()

{
    char tab[100000]; int j=1;
    char chaine[]="ce livre est consacré à l'etude des bases de donnnées et plus       particuliérement à l'etude des bases de données XML";
int i;
for(i=0;chaine[i]!='\0';i++)
{
    if(chaine[i]!=' ')
    {
         tab[j]=chaine[i]; j++;
    }
     else printf("\n");
}
} 

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
Modifié par fiddy le 22/02/2014 à 18:36
Bonjour,

#include <conio.h>
Ce header est non standard. Et comme tu ne t'en sers pas en plus, tu peux donc l'enlever.

#include <stdlib.h>
#include <string.h>

Pour info, c'est inutile ici car tu ne te sers pas de fonctions dont les prototypes sont déclarés dedans. Mais tu peux les laisser si tu veux.

void main()
Le prototype correct de main() sans argument est : int main(void).

char tab[100000];
Tu as fait un #define N 100000. Autant le réutiliser : char tab[N];
Le type n'est pas bon. Tu veux un tableau de mots. Autrement dit, tu souhaites un tableau de chaînes de caractères. Il faut donc 2 dimensions : char tab[X][Y]; ou char *tab[X]; (mais à toi de gérer l'allocation dynamique avec malloc()).

if(chaine[i]!=' ')
tab[j]=chaine[i];j++

Là, tu vas copier toutes les lettres sauf les espaces.
Avec le bon type de tab (cf. remarque plus haute), il faudra faire tab[j][k]=chaine[i]; (oui il faut une autre variable k qu'il faudra remettre à 0 lorsque chaine[i]==' ';

j++;
A mettre plutôt lorsque chaine[i]==' ' (mot suivant).

Et enfin, n'oublie pas le return 0; en fin de main() pour dire que tout s'est bien déroulé.

Le programme ne sera pas encore parfait avec tout ça (pas de gestion du double espace, etc.). Pour info, il existe des fonctions permettant de faire le découpage. Mais j'imagine qu'il s'agit d'un exercice où on te demande de le faire toi-même ?

Corrige tout ça, et n'hésite pas à le reposter avec les corrections s'il reste des erreurs.

Cdlt,

Google is your friend
0
merciiiiiiiiiiiiiiiiiiiii bien fiddy mais le nouveau code ne marche plus je sais pas quel betise j'ai fait s'il vous plait aide moi à resoudre mon probleme ... celui est une etape de mon travail j'ai beaucoup d'autres et merci d'avance :) voila mon code :
#include <stdio.h>
#include <conio.h>
#define N 1000000
int main(void)
{char chaine[]="ce livre est consacré à l'etude des bases de donnnées et plus particuliérement à l'etude des bases de données XML";
int i; int j=0; int k=0;
char tab[j][k];
for(i=0;chaine[i]!='\0';i++)
{
    if(chaine[i]!=' ')
    {
    	i++;
    }
    else
        { printf("%c",chaine[i]);
         tab[j][k]=chaine[i];
         j++; k++;
        
             }
} }
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
23 févr. 2014 à 20:05
Ah bah oui, normal.
char tab[j][k];
j et k valent 0. Donc ton tableau n'est pas très grand... A toi de choisir un tableau suffisament grand pour contenir tes élements (1ère dimension = nombre de mots) 2eme dimension = taille max des mots (attention au caractère de fin))

if(chaine[i]!=' ')
{
i++;
}

<pourquoi i++ ? C'est déjà fait dans le compteur.

printf("%c",chaine[i]);
tab[j][k]=chaine[i];

Tu l'as mis dans le cas chaine[i]==' '. Donc tab[j][k] vaudra ' '. C'est pas ici qu'il faut le mettre.

Tu as oublié de remettre k à 0 lorsque chaine[i]==' '.

k++;
C'est à mettre plutôt dans le cas chaine[i]!=' '.

N'hésite pas à faire l'algorithme sur un papier, cela t'aidera à comprendre pourquoi et à faire le bon algorithme.

Cdlt,
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
24 févr. 2014 à 10:11
il ne faut pas oublier non plus le dernier mot, qui ne se termine pas par un espace, mais que tu dois quand même considérer comme un mot.


Dal
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
24 févr. 2014 à 14:14
Pas d'accord. L'espace indiquera qu'il faut écrire dans la ligne d'après. Le mot suivant sera donc bien écrit...
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
24 févr. 2014 à 14:44
il sera écrit jusqu'où ?
0