Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1047 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°407523
lordankou
Posté le 26-05-2003 à 09:45:37  profilanswer
 

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' ?


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

mood
Publicité
Posté le 26-05-2003 à 09:45:37  profilanswer
 

n°407549
Taz
bisounours-codeur
Posté le 26-05-2003 à 10:13:27  profilanswer
 

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

n°407570
lordankou
Posté le 26-05-2003 à 10:39:15  profilanswer
 

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" ).


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

n°407584
Taz
bisounours-codeur
Posté le 26-05-2003 à 10:46:51  profilanswer
 

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

n°407599
lordankou
Posté le 26-05-2003 à 10:55:02  profilanswer
 

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.


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

n°407607
Taz
bisounours-codeur
Posté le 26-05-2003 à 10:56:59  profilanswer
 

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

n°407629
lordankou
Posté le 26-05-2003 à 11:02:56  profilanswer
 

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 ?


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

n°407637
Taz
bisounours-codeur
Posté le 26-05-2003 à 11:06:11  profilanswer
 

ou des tableaux

n°407639
skeye
Posté le 26-05-2003 à 11:06:40  profilanswer
 

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
n°407655
lordankou
Posté le 26-05-2003 à 11:14:42  profilanswer
 

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.


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

mood
Publicité
Posté le 26-05-2003 à 11:14:42  profilanswer
 

n°407656
Taz
bisounours-codeur
Posté le 26-05-2003 à 11:15:10  profilanswer
 

100

n°407670
lordankou
Posté le 26-05-2003 à 11:20:11  profilanswer
 

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 ?!?


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

n°407836
lordankou
Posté le 26-05-2003 à 13:20:20  profilanswer
 

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


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

n°407842
Taz
bisounours-codeur
Posté le 26-05-2003 à 13:25:04  profilanswer
 

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

n°407851
lordankou
Posté le 26-05-2003 à 13:36:59  profilanswer
 

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.


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

n°407855
Taz
bisounours-codeur
Posté le 26-05-2003 à 13:39:59  profilanswer
 

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

n°407910
lordankou
Posté le 26-05-2003 à 14:11:12  profilanswer
 

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 ?  
 


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

n°407921
skeye
Posté le 26-05-2003 à 14:21:15  profilanswer
 

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?

n°407927
lordankou
Posté le 26-05-2003 à 14:26:36  profilanswer
 

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

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
regexp: recherche la présence de n mots dans une chaine[PHP]Compter le nbre de fois qu'1 chaine de char est presente ds 1 txt
chaine de caractere avec "completer la taille d'une chaine ...
generer une chaine de caractere a partir d'un compteur [i]Probleme avec define : comment recuperer la chaine de la constante ?
[PHP] Accents dans une chaine de caractère 
Plus de sujets relatifs à : sscanf et la saisie d'une chaine de caractère


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR