sscanf et la saisie d'une chaine de caractère

sscanf et la saisie d'une chaine de caractère - C++ - Programmation

Marsh Posté le 26-05-2003 à 09:45:37    

bon voila je voudrais saisir une commande entrée dans le programme du style, et je voudrais récupérer les deux mots séparés (sans utiliser strtock y'a pas droit snif ! ça marchait avec strtock en plus) :
 
cd chemin
put fichier
dir
quit
 
et j'essaie avec sscanf mais j'y arrive pas (j'ai du mal avec la syntaxe de la fonction).
 

Code :
  1. char *nom=" "; /* nom qui suit la commande */
  2. char *commande=" "; /* commande resultant de la ligne de commande */
  3. ...
  4. sscanf(&commande,"%s",&nom,"%s" );
  5. fflush(stdin);


 
mais le problème quand je laisse ça c que je peux même pas taper ma chaine de caractère !
alors que je voudrais par exemple en tapant :
"cd chemin"
avoir "cd" dans 'commande' et "chemin" dans 'nom'
et si je tape seulement "quit" ou "dir" qu'est ce que je risque d'avoir dans 'nom' ?


---------------

Reply

Marsh Posté le 26-05-2003 à 09:45:37   

Reply

Marsh Posté le 26-05-2003 à 10:13:27    

ya pas une ligne qui tiennent la route dans ton prgramme. les deux déclarations c'est géniales, mais y a pas d'allocation, le sscanf, t'as pas compris grand chose au pointeurs, et pour le fflus, il ne sert à rien car cette instruction n'a aucun effet
 
sinon pour ton problème tu peux effectivement utiliser sscanf, ou rechercher à la main des espaces

Reply

Marsh Posté le 26-05-2003 à 10:39:15    

Code :
  1. char *choix_menu="\0"; /* saisie du menu */
  2. char *nom="\0"; /* nom qui suit la commande */
  3. char *commande="\0"; /* commande resultant de la ligne de commande */
  4. ...
  5. gets(choix_menu);
  6. sscanf(choix_menu,"%s %s",commande,nom);
  7. printf("\n\n%s\n", commande);


 
et quand je tape :
cd chemin
il me retourne rien au printf
 
bon là je crois que ça devrait être un peu plus correcte
le problème, je crois, viens de mon gets mais je comprends pas pourquoi.  
si j'ai bien compris :
 
int sscanf (char* text, char* format, ...);
 
veut dire que le premier paramètre est le texte qu'on veut formaté, en second on met le format et en troisième les variables ou on doit les mettre. et c bien ce que je fais non ?
et :
 
char *gets (char *s);
 
ça lit bien une chaine de caractère et la place dans s (dans mon cas ça sera dans "choix_menu" ).


---------------

Reply

Marsh Posté le 26-05-2003 à 10:46:51    

1) ne jamais utiliser gets, mais fgets
2) une allocation pour une chaine, ça te dit un truc?

Reply

Marsh Posté le 26-05-2003 à 10:55:02    

Code :
  1. char *choix_menu="\0"; /* saisie du menu */
  2. char *nom="\0"; /* nom qui suit la commande */
  3. char *commande="\0"; /* commande resultant de la ligne de commande */
  4. ...
  5. fgets(choix_menu,100,stdin);
  6. sscanf(choix_menu,"%s %s",commande,nom);
  7. printf("\n\n%s\n", commande);

 
et bah euh ça marche tjrs pas. bah en fait ça m'affiche
" fichier."
quand je tape "quit"
 
euh sinon l'allocation pour une chaine c réservé un espèce en mémoire pour pouvoir placé la chaine.


---------------

Reply

Marsh Posté le 26-05-2003 à 10:56:59    

gnere des truc comme [] et malloc ça te dit toujours rien?

Reply

Marsh Posté le 26-05-2003 à 11:02:56    

Citation :


gnere des truc comme [] et malloc ça te dit toujours rien?  


 
non on a pas vu ça justement et je vois ça assez souvent dans les programmes sans vraiment comprendre à quoi ça sert.
mais mon problème viendrait de quoi alors parce que là j'ai plus qu'une semaine pour finir et j'ai 6 procédures en assembleur derrière.  
il faudrait que je fasse un malloc sur l'initialisation de mes variables c ça ?


---------------

Reply

Marsh Posté le 26-05-2003 à 11:06:11    

ou des tableaux

Reply

Marsh Posté le 26-05-2003 à 11:06:40    

LordAnkou a écrit :

Citation :


gnere des truc comme [] et malloc ça te dit toujours rien?  


 
non on a pas vu ça justement et je vois ça assez souvent dans les programmes sans vraiment comprendre à quoi ça sert.
mais mon problème viendrait de quoi alors parce que là j'ai plus qu'une semaine pour finir et j'ai 6 procédures en assembleur derrière.  
il faudrait que je fasse un malloc sur l'initialisation de mes variables c ça ?


Oui.
En déclarant tes char * tu n'alloues pas la mémoire nécéssaire au stockage des chaines de caractères que tu essayes d'y mettre...
Taz te suggérait aussi en parlant de [] d'utiliser directement des tableaux plutot que des pointeurs, vu que tu ne sembles pas connaitre bien les pointeurs...
[edit]
grillaid


Message édité par skeye le 26-05-2003 à 11:07:13
Reply

Marsh Posté le 26-05-2003 à 11:14:42    

Code :
  1. char *choix_menu; /* saisie du menu */
  2. char *nom; /* nom qui suit la commande */
  3. char *commande; /* commande resultant de la ligne de commande */
  4. choix_menu=(char *) malloc(30);
  5. nom=(char *) malloc(10);
  6. commande=(char *)malloc(20);
  7. fgets(choix_menu,100,stdin);
  8. sscanf(choix_menu,"%s %s",commande,nom);
  9. printf("\n%s\n", commande);


bon là j'alloue bien de l'espace en mémoire et ça marche tjrs pas.
je comprends vraiment pas.


---------------

Reply

Marsh Posté le 26-05-2003 à 11:14:42   

Reply

Marsh Posté le 26-05-2003 à 11:15:10    

100

Reply

Marsh Posté le 26-05-2003 à 11:20:11    

Code :
  1. char *choix_menu; /* saisie du menu */
  2. char *nom; /* nom qui suit la commande */
  3. char *commande; /* commande resultant de la ligne de commande */
  4. choix_menu=(char *) malloc(100);
  5. nom=(char *) malloc(50);
  6. commande=(char *)malloc(50);
  7. fgets(choix_menu,100,stdin);
  8. sscanf(choix_menu,"%s %s",commande,nom);
  9. printf("\n%s\n", commande);

 
 
 
bon là je me trompe pas c bien ça ?!?


---------------

Reply

Marsh Posté le 26-05-2003 à 13:20:20    

c définitivement mon fgets qui déconne !
il m'affiche un bout de mot (tjrs le même : "chier." qui ne sort de je ne sais ou !
mais ou est mon erreur please !!!
 

Code :
  1. char *choix_menu; /* saisie du menu */
  2. choix_menu=(char *)malloc(100);
  3. ...
  4. fgets(choix_menu,(sizeof choix_menu),stdin);
  5. fprintf(stdout,"%s", choix_menu);
  6. ...


 
je vois vraiment pas d'ou vient mon erreur là.
j'ai bien attribué la bonne taille pour la mémoire
j'ai fait gaffe aux pointeurs...
bref là je sèche trop aider moi please


---------------

Reply

Marsh Posté le 26-05-2003 à 13:25:04    

ton sizeof renvoie la taille du pointeur, aps de la zone pointée. ce n'est pas un tableau.

Reply

Marsh Posté le 26-05-2003 à 13:36:59    

Code :
  1. char *choix_menu; /* saisie du menu */
  2. choix_menu=(char *)malloc(100);
  3. ...
  4. fgets(choix_menu,(sizeof *choix_menu),stdin);
  5. fprintf(stdout,"%s", choix_menu);
  6. ...


 
en effet j'avais oublié que j'avais change mon choix_menu pour y mettre un pointeur mais bon maintenant que j'ai modifié ça je n'ai pas le temps de saisir ma chaine et étant donné que le bout de code ci dessus est dans une boucle il boucle tout le temps sans que je puisse saisir mon code. c pas trop normal parce que là je fais attention à la taille de la zone pointée.


---------------

Reply

Marsh Posté le 26-05-2003 à 13:39:59    

t'as rien compris. utilise une constante pour à la place du sizeof qui ne marche pas. achete toi aussi un bouquin de C

Reply

Marsh Posté le 26-05-2003 à 14:11:12    

j'utilise 100 et ça marche pas...  
si je résume j'utilise un pointeur auquel j'attribue une taille de 100.
ensuite je fais un fgets(choix_menu,100,stdin); donc je lis ma chaine jusqu'au caractère de saut de ligne et je le mes dans choix_menu.
ensuite je fais un printf de mon choix_menu.  
mais ou est l'erreur ?
 
en ce qui concerne ce que tu marques ensuite :
tu penses que j'ai le temps de lire un bouquin sachant que je dois finir pour ça demain soir...
et je sais que j'ai pas tout compris mais c pas en me disant : "t'as rien compris, achète toi un bouquin de C (et dégage)." que je vais avancer. c un forum non ?  
 


---------------

Reply

Marsh Posté le 26-05-2003 à 14:21:15    

LordAnkou a écrit :

j'utilise 100 et ça marche pas...  
si je résume j'utilise un pointeur auquel j'attribue une taille de 100.
ensuite je fais un fgets(choix_menu,100,stdin); donc je lis ma chaine jusqu'au caractère de saut de ligne et je le mes dans choix_menu.
ensuite je fais un printf de mon choix_menu.  
mais ou est l'erreur ?
 
en ce qui concerne ce que tu marques ensuite :
tu penses que j'ai le temps de lire un bouquin sachant que je dois finir pour ça demain soir...
et je sais que j'ai pas tout compris mais c pas en me disant : "t'as rien compris, achète toi un bouquin de C (et dégage)." que je vais avancer. c un forum non ?  
 
 


Là il t'affiche quoi?

Reply

Marsh Posté le 26-05-2003 à 14:26:36    

Code :
  1. char *choix_menu; /* saisie du menu */
  2. char *nom; /* nom qui suit la commande */
  3. char *commande; /* commande resultant de la ligne de commande */
  4. char buffer[14] ; /* le repertoire courant ou l'on se trouve */
  5. /* allocation de la mémoire */
  6. choix_menu=(char *)malloc(100);
  7. nom=(char *) malloc(50);
  8. commande=(char *)malloc(50);
  9.   /* --------- */
  10.   /* Interface */
  11.   /* --------- */
  12.   textbackground(0); /* couleur de fond = noir */
  13.   clrscr(); /* on nettoie l'écran avec la couleur du fond */
  14.   textbackground(1) ; /* fond bleu */
  15.   insline(); /* insère une ligne de la couleur du fond */
  16.   textcolor(14); /* texte jaune */
  17.   gotoxy(40,1); /* 85,25 caractère */
  18.   cprintf("FTP\n\n\r" );
  19.   textbackground(0);
  20.   cprintf("KERDREUX Sylvain\n\r" );
  21.   cprintf("Derniere modification le 25/05/03\n\r" );
  22.   cprintf("Groupe III\n\r" );
  23.   textcolor(7); /* texte en gris clair */
  24.   /* préparation de la fenetre */
  25.   window(wherex()+10, wherey()+2,70,22); /* on definit une fenetre active à x, y courant +2 de largeur 70 et de hauteur 21 */
  26.   /* verification de la syntaxe de la ligne de commande */
  27.     if (argc!=1)
  28.     {
  29.       printf("\nAucun parametre n'est necessaire !" );
  30.       afficher_quitter();
  31.       return(argc);
  32.     }
  33.   /* initialise le repertoire courant */
  34.   if (gtcwd(buffer,25) == NULL)
  35.     {
  36.       printf("\nImpossible de determiner le repertoire courant !\n" );
  37.       return (-1);
  38.     }
  39.   /* -------------------- */
  40.   /* -- initialisation -- */
  41.   /* -------------------- */
  42.   init();
  43.   /* ------------------------- */
  44.   /* -- Traitements des cas -- */
  45.   /* ------------------------- */
  46.   do
  47.     {
  48.       textbackground(1); /* fond bleu */
  49.       clrscr(); /* on rend la fenetre en bleu */
  50.       /* ---------- */
  51.       /* -- menu -- */
  52.       /* ---------- */
  53.       textbackground(1); /* fond bleu */
  54.       clrscr(); /* on rend la fenetre en bleu */
  55.       gotoxy(1,1);
  56.       cprintf("\r\nMENU : \n\n\r " );
  57.       cprintf("\nVoici les commandes acceptees : \r" );
  58.       cprintf("\n > ?\r" );
  59.       cprintf("\n > dir\r" );
  60.       cprintf("\n > cd chemin\r" );
  61.       cprintf("\n > put nomfich\r" );
  62.       cprintf("\n > get\r" );
  63.       cprintf("\n > quit\r" );
  64.       cprintf("\n\n\r" );
  65.       cprintf("\ncommande :\n\r" );
  66.       /* --------------------------- */
  67.       /* -- saisie de la commande -- */
  68.       /* --------------------------- */
  69.       fprintf(stdout,"%s", choix_menu);
  70.       fgets(choix_menu,100,stdin);
  71.       /*sscanf(choix_menu,"%s %s",commande,nom);*/
  72.       fprintf(stdout,"%s", choix_menu);


 
au premier fprintf il m'affiche "commande : "
et au deuxième il m'affiche " fichier."


Message édité par lordankou le 26-05-2003 à 14:30:49

---------------

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed