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
Salut!! je veux s'il vous plait un programme qui lit des chaînes et les met dans un pointeur , ça veux dire chaque chaîne dans un pointeur. mais ça veut pas quand je depasse 8 lettre je vois un probleme c'est mon travail :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char a;
char ***t;
int i=1,b,tt;
int j=1;
int n=sizeof(char);
t = malloc(sizeof(char**));
*t=malloc(sizeof(char*));
//**t=malloc(sizeof(double));
do{
gets(*t+i);
*t=realloc(*t,(i+1)*sizeof(char**));
i=i+1;
} while(i<4);
for(j=1;j<4;j++){
printf("%s ",(*t)+j);
}
//printf("%d",n);
//printf("%s\n",t+j);
}

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
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,
1
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
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);
}
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
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,
0
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
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);

}
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
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 :
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
0
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
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...
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 à 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,
0
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
Le Dernier Programme que tu as Ecris Me donne Pas les chaînes que je veux :

http://img15.hostingpics.net/pics/54424705012014221142.png
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 à 23:25
Tu as dû mal prendre en compte mes remarques.
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;
}

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
C'est Super Mr :D . ça marche , maintenant la condition je la met comme ça ?
do{ /*///////*/ } while(t[i]!="\n")
0