Posté(e) le 3 avril 200619 a salut tout le monde.moi je suis nouvelle dans ce forum et j'aimerai bien retrouvé des réponses a mon problemes,et merci d'avance. ok maintenant je vais posé mon probleme. j'ai écrit un programme en c et je le compile en dev c++ alors je voudrais affiché des tableaux qui sont nommés(l0,l1,l2) alors tout s'affiche bien sauf que le dernier(l2) m'affiche un manque qui veut dire qu'il m'affiche pas du tt l2[0] ;il m'ecrit l2[0]= et rien ne s'affiche alors que la suite 'affiche le plus normal possible.alors pourquoi? et ben c ca la questio et merci 'avance
Posté(e) le 3 avril 200619 a tu peux poster le code de ta boucle d'affichage entre balise , s'il te plaît ?
Posté(e) le 3 avril 200619 a Auteur [MODO] Post édité par le modo pour remettre les balises "code" dans le bon sens. On est prié de relire ses posts, c'est le minimum si on attend une réponse... #include<stdio.h> #include<stdlib.h> main() { int r,i,j,k,ns,x,nsuc,l1[100]; char l0[100],l2[100],s,suc; k=0; x=0; printf("entrer le nbre de sommets:\n"); scanf("%d",&ns); if(ns>100) printf("depassement de capacité\n"); else { if(ns<=0) printf("erreur"); else { for(i=0;i<ns;i++) { printf("entrer le sommet:\n"); scanf("%s",&s); l0[i]=s; printf("entrer le nbre de successeur:\n"); scanf("%d",&nsuc); if(nsuc>0) { x=k+nsuc-1; for(j=k;j<=x;j++) { printf("entrer le succeseur:\n"); scanf("%s",&suc); l2[j]=suc; l1[i]=k; } k=l1[i]+nsuc; } else { l2[k]='*'; l1[i]=k; k=k+1; } } } if(nsuc!=0) l1[ns]=nsuc+l1[ns-1]; else l1[ns]=l1[ns-1]+1; printf("**************************affichage des listes******************************\n"); printf("\n"); printf("**************************affichage des sommets******************************\n"); printf("\n"); for(i=0;i<ns;i++) printf(" l0[%d] = %c", i , l0[i]); printf("\n"); system("PAUSE"); printf("**************************affichage des adresse de successeurs******************************\n"); printf("\n"); for(j=0;j<=ns;j++) printf(" l1[%d] = %d", j , l1[j]); printf("\n"); system("PAUSE"); printf("**************************affichage des successeurs******************************\n"); printf("\n"); for(r=0;r<k;r++) printf(" l2[%d] = %c", r , l2[r]); printf("\n"); system("PAUSE"); } } Modifié le 3 avril 200619 a par Sentinel
Posté(e) le 3 avril 200619 a oula... tu as plein de test conditionnels inutiles genre if( truc) printf("erreur\n"); else { //corps du programme } return 0; c'est absolument pas lisible. Essayes plutôt : if( condition) { printf("erreur\n"); exit(-1); } //corps du programme return 0; EDIT 1 : char l0[100]; ... printf("entrer le sommet:\n"); scanf("%s", &s); l0[i] = s; ça, ça ne marche pas... ou du moins, pas comme tu le penses, à mon avis. I0 est un char, dans lequel tu essayes de faire entrer une chaine de caractère (un char*, donc). la bone syntax pour scanf("%s") est systématiquement la suivante : char * buf; buf = (char*) malloc(sizeof(char)*25); scanf("%s", buf); ou bien char buf[25]; scanf("%s", buf); sachant que la chaine sera d'une taille max de 25 caractères. dans le cas où tu veux faire un tableau de chaines de caractère, et bien il te faut un char**, comme ici : char** buf; ... buf[i] = (char*) malloc(sizeof(char)*25); scanf("%s", buf[i]); EDIT 2: dans ton cas, je pense que le nom de tes sommets n'est que un seul char, donc au lieu de scanf("%s", &s); il te faut plutôt scanf(" %c", &s) oui, on met " %c" et non pas "%c" à cause d'une sombre histoire de buffeur. Pour faire plus simple, quand il te faut un caractère, utilise getc : s = getc();
Posté(e) le 3 avril 200619 a en retouchant un peu ton code avec les indications que je t'ai données, voilà ce que j'obtiens : $ ./truc2 entrer le nbre de sommets: 3 entrer le sommet: a entrer le nbre de successeur: 1 entrer le succeseur: b entrer le sommet: b entrer le nbre de successeur: 1 entrer le succeseur: c entrer le sommet: c entrer le nbre de successeur: 1 entrer le succeseur: a **************************affichage des listes****************************** **************************affichage des sommets****************************** l0[0] = a l0[1] = b l0[2] = c **************************affichage des adresse de successeurs****************************** l1[0] = 0 l1[1] = 1 l1[2] = 2 l1[3] = 3 **************************affichage des successeurs****************************** l2[0] = b l2[1] = c l2[2] = a j'imagine que c'est le résultat que tu voulais, non ?
Posté(e) le 5 avril 200619 a Tiens pas mal, je ne connaissait pas le coup du " %c" Pareil, bon à savoir, merci lorinc.
Posté(e) le 5 avril 200619 a c'est fou ce qu'on peut apprendre comme truc grâce aux étudiants qui font toujours la solution la plus bordelique...
Posté(e) le 5 avril 200619 a Auteur slt une autre fois et merci pour votre aide mais seulement moi kon j met le %c a la place de %s ca m'affiche ce entrer le sommet entrer le nbre e successeur et en plus le s=getc() m'affiche c erreurs too few argument to function'int getc(FILE*) alors je comprend rien et merci.
Posté(e) le 5 avril 200619 a c'est bien pour ça que je disais " %c" avec un espace avant le % sinon, pour getc(), merci microsoft... c=getc(stdin) devrait résoudre le problème, sinon c=getchar()
Posté(e) le 5 avril 200619 a Auteur merci beuacoup.vous m'aviez tres bien resolu mo probleme c magnifique ce forum et l'espace avant le %c ca c kelke chose en plus pour moion apprend toujour avec vous merci
Posté(e) le 5 avril 200619 a C'est quoi cette histoire d'espace avant %c :o J'ai jamais eu de probleme... Et sinon avec un scanf("%s",variable) --> on met pas &variable logiquement...
Posté(e) le 6 avril 200619 a en fait ça arrive quand tu fais une séquence tu type : printf("entrez choix 1\n"); scanf("%c", &buf1); printf("entrez choix 2\n"); scanf("%c", &buf2); lors du premier scanf, il y a "x\n" dans le buffer d'entrée, et scanf récupère le 'x' pour le mettre dans buf1, mais ne vide pas le buffer d'entrée. Du coup lors du second scanf, il y a "\nx\n" dans le buffer d'entrée, et scanf récupère '\n' et le met dans buf2, laissant "x\n" dans le buffer d'entrée, etc, etc... ça n'arrive jamais parce qu'un est de gros fainéant qui préferrons getc() plutôt que scanf("%c"), voilà
Posté(e) le 6 avril 200619 a Ouai je vois tres bien ce que tu veux dire en fait Moi je ferais dans ce cas un fflush(stdin) pour vider le buffer clavier dans ce cas
Posté(e) le 6 avril 200619 a Pas en c. Moi j'ai toujours mon while((c=getchar())=='\n') qui m'a fidèlement servit.
Posté(e) le 6 avril 200619 a Non tant que c'est '\n', on n'en veut pas, dont on continue la boucle (donc le getchar), jusqu'à avoir un caractère différent de '\n' Alors on trolle sur perl, mais un petit until serait un peu plus intuitif pour le coup
Posté(e) le 6 avril 200619 a Ah oui pour vider le buffer, pas pour lire des caractères sur stdin... j'ai lu en diagonale, honte à moi
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.