April 3, 200619 yr 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
April 3, 200619 yr Author [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"); } } Edited April 3, 200619 yr by Sentinel
April 3, 200619 yr 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();
April 3, 200619 yr 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 ?
April 5, 200619 yr Tiens pas mal, je ne connaissait pas le coup du " %c" Pareil, bon à savoir, merci lorinc.
April 5, 200619 yr c'est fou ce qu'on peut apprendre comme truc grâce aux étudiants qui font toujours la solution la plus bordelique...
April 5, 200619 yr Author 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.
April 5, 200619 yr 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()
April 5, 200619 yr Author 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
April 5, 200619 yr 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...
April 6, 200619 yr 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à
April 6, 200619 yr 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
April 6, 200619 yr Pas en c. Moi j'ai toujours mon while((c=getchar())=='\n') qui m'a fidèlement servit.
April 6, 200619 yr 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
April 6, 200619 yr Ah oui pour vider le buffer, pas pour lire des caractères sur stdin... j'ai lu en diagonale, honte à moi
Archived
This topic is now archived and is closed to further replies.