Programme C
Fermé
xanonyme47
Messages postés
14
Date d'inscription
dimanche 24 novembre 2013
Statut
Membre
Dernière intervention
5 janvier 2014
-
Modifié par xanonyme47 le 5/01/2014 à 20:09
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 6 janv. 2014 à 10:36
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 6 janv. 2014 à 10:36
A voir également:
- Programme C
- Programme demarrage windows 10 - Guide
- Désinstaller programme windows 10 - Guide
- Programme démarrage windows 10 - Guide
- Forcer la fermeture d'un programme - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
3 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
5 janv. 2014 à 20:40
5 janv. 2014 à 20:40
Bonjour,
gets(*t+i);
gets() est à proscrire, utilise plutôt fgets(). Pour info, tu peux utiliser t[i] au lieu de *t+i, c'est la même chose en plus clair.
Ce que tu souhaites nécessite donc 2 dimensions (1 pour stocker une chaîne, une autre pour stocker les chaînes). Donc char **t; suffit.
Tu as oublié d'allouer **t : **t=malloc(...*sizeof **t);
for(j=1;j<4;j++){
Les tableaux (au sens général) commencent à l'indice 0. Donc j=0.
Tu as oublié de faire un return 0 à la ifn du main().
PS : quand tu postes ton code, utilise la balise "code" et sélectionne "C" pour qu'il soit correctement indenté.
Cdlt,
gets(*t+i);
gets() est à proscrire, utilise plutôt fgets(). Pour info, tu peux utiliser t[i] au lieu de *t+i, c'est la même chose en plus clair.
Ce que tu souhaites nécessite donc 2 dimensions (1 pour stocker une chaîne, une autre pour stocker les chaînes). Donc char **t; suffit.
Tu as oublié d'allouer **t : **t=malloc(...*sizeof **t);
for(j=1;j<4;j++){
Les tableaux (au sens général) commencent à l'indice 0. Donc j=0.
Tu as oublié de faire un return 0 à la ifn du main().
PS : quand tu postes ton code, utilise la balise "code" et sélectionne "C" pour qu'il soit correctement indenté.
Cdlt,
xanonyme47
Messages postés
14
Date d'inscription
dimanche 24 novembre 2013
Statut
Membre
Dernière intervention
5 janvier 2014
Modifié par xanonyme47 le 5/01/2014 à 20:48
Modifié par xanonyme47 le 5/01/2014 à 20:48
Merci Mr :) Merci beaucoup , mais y a encore un problem just aprés l execution :
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(){ char a; char **t; int i=0,j=0; int n=sizeof(char); t = malloc(sizeof(char**)); *t=malloc(sizeof(char*)); **t=malloc(sizeof(char)); do{ fgets(stdin,t[i],100); *t=realloc(*t,(i+1)*sizeof(char**)); i=i+1; } while(i<3); for(j=0;j<3;j++){ printf("%s ",(*t)+j); } return(0); }
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
5 janv. 2014 à 21:00
5 janv. 2014 à 21:00
Tu n'as pas répondu à ma question sur le nombre de dimensions, du coup tu es tombé dans le piège ;-).
fgets(stdin,t[i],100);
t[i] est de type char**. Il faudrait que ce soit de type char*. Donc plutôt : fgets(stdin,(*t)[i],100); ou alors il faut revoir tes dimensions. As-tu vraiment besoin de 3 dimensions alors que 2 suffirait ?
Autre problème, j'ai mis : malloc(...*sizeof (char)); le ... est à renseigner. C'est toi qui dis combien souhaites-tu de place dans une chaîne. Si tu mets 100 dans le fgets, il faudra mettre 100 à la place des "...".
Et la prochaine fois que tu repostes, peux-tu indenter ton code ? C'est moins fatigant pour nos povres petits yeux :-).
Cdlt,
fgets(stdin,t[i],100);
t[i] est de type char**. Il faudrait que ce soit de type char*. Donc plutôt : fgets(stdin,(*t)[i],100); ou alors il faut revoir tes dimensions. As-tu vraiment besoin de 3 dimensions alors que 2 suffirait ?
Autre problème, j'ai mis : malloc(...*sizeof (char)); le ... est à renseigner. C'est toi qui dis combien souhaites-tu de place dans une chaîne. Si tu mets 100 dans le fgets, il faudra mettre 100 à la place des "...".
Et la prochaine fois que tu repostes, peux-tu indenter ton code ? C'est moins fatigant pour nos povres petits yeux :-).
Cdlt,
xanonyme47
Messages postés
14
Date d'inscription
dimanche 24 novembre 2013
Statut
Membre
Dernière intervention
5 janvier 2014
5 janv. 2014 à 21:21
5 janv. 2014 à 21:21
je pence que j'ai besoin de 3 dimensions parceque je veux chaque chaîne dans **t est chaque phrase dans *t. alors j'ai modifier le code que ça soit comme je veux mais ça me donne envie de me tuer -_- , ça marche pas encore ....
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { //Declaration du variable. char ***t; int i=0,j=0; //allocation du memoire. t = malloc(100*sizeof(char***)); *t=malloc(100*sizeof(char**)); **t=malloc(100*sizeof(char*)); ***t=malloc(100*sizeof(char)); //boucles do{ fgets(stdin,*(*t)[i],100); i=i+1; } while(i<3); for(j=0;j<3;j++){ printf("%s ",(*t)+j); } return(0); }
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
Modifié par fiddy le 5/01/2014 à 22:54
Modifié par fiddy le 5/01/2014 à 22:54
je pence que j'ai besoin de 3 dimensions parceque je veux chaque chaîne dans **t est chaque phrase dans *t.
Donc, ça fait 2 dimensions (la première : les phrases, la seconde : le contenant).
Il ne fallait pas mettre des 100 partout . Juste pour la dimension recevant les phrases.
t = malloc(100*sizeof(char***));
Non. t est de type char***, et il contient des char**. Donc sizeof(char**).
Du coup, tout est décalé:
***t=malloc(100*sizeof(char));
***t est de type char. Donc rien à allouer.
Donc cela donnerait :
En axe d'amélioration, tu pourrais économiser les premiers mallocs (un realloc sur une chaîne NULL vaut un malloc). Ensuite, au lieu de mettre "3" en dur dans le code, tu pourrais stocker toutes les chaînes de l'utilisateur jusqu'à ce qu'il rentre par exemple "FIN" (strcmp()).
Je te conseille aussi de faire des fonctions pour rendre le code plus propre (ici une fonction d'affichage, 1 fonction contenant les malloc, etc.). Il ne faut pas oublier non plus les free().
Sinon, les realloc, c'est assez lourd en mémoire. Pour ce genre de programme, on utilise plutôt les listes chaînées (enfin tu verras cette notion par toi-même si tu poursuis le C).
Cdlt,
Google is your friend
Donc, ça fait 2 dimensions (la première : les phrases, la seconde : le contenant).
Il ne fallait pas mettre des 100 partout . Juste pour la dimension recevant les phrases.
t = malloc(100*sizeof(char***));
Non. t est de type char***, et il contient des char**. Donc sizeof(char**).
Du coup, tout est décalé:
***t=malloc(100*sizeof(char));
***t est de type char. Donc rien à allouer.
Donc cela donnerait :
char **t; t = malloc(sizeof(char*)); /*création d'un conteneur d'une seule chaîne)*/ *t=malloc(100*sizeof(char)); /*la première chaîne pourra contenir 99 caractères*/ do{ fgets(t[i],100,stdin); /*tu as inversé t[i] et stdin*/ t[i]=realloc(t[i],(strlen(t[i])+1)*sizeof(char)); /*on réajuste la taille de la chaîne (initialement c'était à 100)*/ i=i+1; t = realloc(t, (i+1)*sizeof(char*)); /*on agrandit le conteneur d'une case*/ t[i]= malloc(100*sizeof(char)); /*on alloue la place qui contiendra la chaîne*/ } while(i<3); /*Ne pas oublier les free()*/
En axe d'amélioration, tu pourrais économiser les premiers mallocs (un realloc sur une chaîne NULL vaut un malloc). Ensuite, au lieu de mettre "3" en dur dans le code, tu pourrais stocker toutes les chaînes de l'utilisateur jusqu'à ce qu'il rentre par exemple "FIN" (strcmp()).
Je te conseille aussi de faire des fonctions pour rendre le code plus propre (ici une fonction d'affichage, 1 fonction contenant les malloc, etc.). Il ne faut pas oublier non plus les free().
Sinon, les realloc, c'est assez lourd en mémoire. Pour ce genre de programme, on utilise plutôt les listes chaînées (enfin tu verras cette notion par toi-même si tu poursuis le C).
Cdlt,
Google is your friend
xanonyme47
Messages postés
14
Date d'inscription
dimanche 24 novembre 2013
Statut
Membre
Dernière intervention
5 janvier 2014
5 janv. 2014 à 23:06
5 janv. 2014 à 23:06
je te remercie Mr . et je suis desole parceque je te derrenge..
oui oui mon exercice c'est d'utiliser les fonctions ... et de ne pas metre 3 fois . dans l'ex il y a ( le dernier chaine est un ptr null) alors comment je peux faire ça ? par exepmle l 'enregistrement s'arrete quand l utilisateur click entrer 2 fois...
oui oui mon exercice c'est d'utiliser les fonctions ... et de ne pas metre 3 fois . dans l'ex il y a ( le dernier chaine est un ptr null) alors comment je peux faire ça ? par exepmle l 'enregistrement s'arrete quand l utilisateur click entrer 2 fois...
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
5 janv. 2014 à 23:16
5 janv. 2014 à 23:16
Bah ne sois pas désolé. C'est le but du forum ;-))).
quand l utilisateur click entrer 2 fois...
La vraie condition (j'imagine) est "chaîne vide" (le 1er enter pour valider la chaîne précédente, et le 2nd pour faire une chaîne vide).
La condition while(i<3) doit donc devenir TantQue(chaîne="\n") (à toi de traduire en C pour exercice). La chaîne vide, correspond à t[i]=NULL;
Je pense qu'en relisant mes remarques et mon code précédent, tu devrais réussir par toi-même de proposer une nouvelle version.
Bon courage.
Cdlt,
quand l utilisateur click entrer 2 fois...
La vraie condition (j'imagine) est "chaîne vide" (le 1er enter pour valider la chaîne précédente, et le 2nd pour faire une chaîne vide).
La condition while(i<3) doit donc devenir TantQue(chaîne="\n") (à toi de traduire en C pour exercice). La chaîne vide, correspond à t[i]=NULL;
Je pense qu'en relisant mes remarques et mon code précédent, tu devrais réussir par toi-même de proposer une nouvelle version.
Bon courage.
Cdlt,
xanonyme47
Messages postés
14
Date d'inscription
dimanche 24 novembre 2013
Statut
Membre
Dernière intervention
5 janvier 2014
5 janv. 2014 à 23:17
5 janv. 2014 à 23:17
Le Dernier Programme que tu as Ecris Me donne Pas les chaînes que je veux :
http://img15.hostingpics.net/pics/54424705012014221142.png
http://img15.hostingpics.net/pics/54424705012014221142.png
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
Modifié par fiddy le 5/01/2014 à 23:25
Modifié par fiddy le 5/01/2014 à 23:25
Tu as dû mal prendre en compte mes remarques.
Je mets le code ici :
Je mets le code ici :
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { /*Declaration du variable.*/ char **t; int i=0; /*allocation du memoire.*/ t = malloc(sizeof(char*)); *t=malloc(100*sizeof(char)); /*boucles*/ do{ fgets(t[i],100,stdin); t[i]=realloc(t[i],(strlen(t[i])+1)*sizeof(char)); /*on réajuste la taille de la chaîne (initialement c'était à 100)*/ i=i+1; t = realloc(t, (i+1)*sizeof(char*)); /*on agrandit le conteneur d'une case*/ t[i]= malloc(100*sizeof(char)); /*on alloue la chaîne*/ } while(i<3); for(i=0;i<3;i++){ printf("%s\n",t[i]); } /*Ici, il faudrait mettre les free()*/ return 0; }
xanonyme47
Messages postés
14
Date d'inscription
dimanche 24 novembre 2013
Statut
Membre
Dernière intervention
5 janvier 2014
Modifié par xanonyme47 le 5/01/2014 à 23:28
Modifié par xanonyme47 le 5/01/2014 à 23:28
C'est Super Mr :D . ça marche , maintenant la condition je la met comme ça ?
do{ /*///////*/ } while(t[i]!="\n")