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

  FORUM HardWare.fr
  Programmation
  C

  récupérer des entiers depuis un paramètre de la fonction main

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

récupérer des entiers depuis un paramètre de la fonction main

n°1209740
treolar
Posté le 28-09-2005 à 13:01:39  profilanswer
 

Bonjour,
 
Le prototype de la fonction main est comme suit :
int main(int argc, char* argv[])
 
Dans argv[1], on récupère le premier paramètre passé au programme en ligne de commande.
C'est une chaine de caractères qui aura toujours la forme :  
totoxx_yyy.dat  
(ex: toto12_250.dat)
 
Je voudrais récupérer dans deux entiers n et m, les valeurs de xx et yyy.
 
Merci pour votre aide.
Je suis débutant en prog, une simple piste pourrait déjà m'aider grandement...
Je suppose qu'il doit exister des fontions pour se déplacer dans la chaine de caractères et récupérer les caractères, puis les convertir en entier ?

mood
Publicité
Posté le 28-09-2005 à 13:01:39  profilanswer
 

n°1209752
Emmanuel D​elahaye
C is a sharp tool
Posté le 28-09-2005 à 13:12:20  profilanswer
 

treolar a écrit :

Dans argv[1], on récupère le premier paramètre passé au programme en ligne de commande.
C'est une chaine de caractères qui aura toujours la forme :  
totoxx_yyy.dat  
(ex: toto12_250.dat)
 
Je voudrais récupérer dans deux entiers n et m, les valeurs de xx et yyy.


strtol() (entier signé)  ou strtoul() (entier non signé) en passant la bonne adresse de départ.

  • Bien lire la doc de ces fonctions.
  • La conversion s'arrête automatiquement au premier caractère non convertible.  
  • C'est une bonne occasion d'utiliser le 2ème paramètre...

Fait de ton mieux et poste ton code.


Message édité par Emmanuel Delahaye le 28-09-2005 à 13:12:55

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1209762
Sve@r
Posté le 28-09-2005 à 13:22:14  profilanswer
 

treolar a écrit :

Bonjour,
 
Le prototype de la fonction main est comme suit :
int main(int argc, char* argv[])
 
Dans argv[1], on récupère le premier paramètre passé au programme en ligne de commande.
C'est une chaine de caractères qui aura toujours la forme :  
totoxx_yyy.dat  
(ex: toto12_250.dat)
 
Je voudrais récupérer dans deux entiers n et m, les valeurs de xx et yyy.
 
Merci pour votre aide.
Je suis débutant en prog, une simple piste pourrait déjà m'aider grandement...
Je suppose qu'il doit exister des fontions pour se déplacer dans la chaine de caractères et récupérer les caractères, puis les convertir en entier ?


 
La fonction "strstr()" permet d'extraire des sous-chaînes de chaînes. Mais c'est une fonction lourde.
Si tu es certain certain que
1) la chaîne commence par "toto" (4 caractères)
2) xx fait bien et fera toujours 2 caractères
3) yyy en fera toujours 3 et se trouve en 8° position
Alors tu peux utiliser directement "strtoul()" qui converti une chaîne en nombre
 

Code :
  1. #include <stdlib.h>                       // C'est nécessaire à la déclaration de "strtoul"
  2. main(int argc, char *argv[])
  3. {
  4.     // Déclarations des variables "n" et "m"
  5.     unsigned short n, m;
  6.     // Convertir les chaînes en nombre - Bien démarrer à la bonne position
  7.     n=strtoul(argv[1] + 3, NULL, 10);
  8.     m=strtoul(argv[1] + 7, NULL, 10);
  9. }


 
Evidemment, c'est pas franchement joli joli. Si jamais ta chaîne entrante change de format, tu dois reprogrammer pas mal de choses => c'est pas un code "propre" mais qui fonctionne dans ce cas précis.
Si maintenant tu veux un code plus adaptable aux données entrantes, alors cela devient un peu plus compliqué

Message cité 1 fois
Message édité par Sve@r le 28-09-2005 à 13:26:42
n°1209773
treolar
Posté le 28-09-2005 à 13:35:06  profilanswer
 

Ok dac, c'est ce que je recherchais, j'ai la un bon exemple pour essayer maintenant, de faire plus compliqué. Par exemple dans le cas où n et m n'ont pas toujours 2 et 3 caractères...
 
En tout cas, merci bien pour votre spontanéité !
 
Je reviendrais poster ce que j'aurai fait...

n°1209786
chrisbk
-
Posté le 28-09-2005 à 13:48:05  profilanswer
 

c'est quoi ce strtoul sans verif de resultat la ? [:dawao]
 
ah ué nan, j'ai rien dit, enfin si un peu, mais bon :d


Message édité par chrisbk le 28-09-2005 à 13:48:50
n°1209814
Emmanuel D​elahaye
C is a sharp tool
Posté le 28-09-2005 à 13:56:50  profilanswer
 

Sve@r a écrit :


Code :
  1. // Déclarations des variables "n" et "m"
  2.     unsigned short n, m;
  3.     // Convertir les chaînes en nombre - Bien démarrer à la bonne position
  4.     n=strtoul(argv[1] + 3, NULL, 10);
  5.     m=strtoul(argv[1] + 7, NULL, 10);




Pourquoi unsigned short, alors que strtoul() retourne un unsigned long ?

Message cité 1 fois
Message édité par Emmanuel Delahaye le 28-09-2005 à 13:57:32

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1209905
Sve@r
Posté le 28-09-2005 à 15:15:31  profilanswer
 

Emmanuel Delahaye a écrit :

Pourquoi unsigned short, alors que strtoul() retourne un unsigned long ?


 
En fait, je crois que la bonne question serait "pourquoi strtoul alors que les variables sont en unsigned short ?"
Ce qui m'amène à ma première réponse : parce que "strtous" n'existe pas... :D  
 
En fait, étant donné que "xx" et "yyy" de par la description qui en a été faite sont des entiers variant de "00" à "999", ils sont forcéments positifs et leur plage de valeur peut tenir sur un short d'où le "unsigned short".
 
Maintenant, "strtoul" ramène effectivement un "unsigned long" mais il sera transformé de façon implicite en "unsigned short". Certes, il y aura troncature de 2 octets mais ces octets étant toujours remplis de "0" non significatifs, il n'y aura aucune perte de valeur.


Message édité par Sve@r le 28-09-2005 à 15:20:45
n°1210356
0x90
Posté le 28-09-2005 à 23:21:11  profilanswer
 

si jamais le nom du fichier est de la forme toto-1_450.dat , ton strtoul va prendre un négatif ( c un exemple ), 'fin si on peut _vraiment_ faire confiance a l'input ca va, sinon les résultats sur un tableau vont être franchement joyeux ^^


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1210401
Elmoricq
Modérateur
Posté le 29-09-2005 à 07:01:36  profilanswer
 

Et puis, bon, je me demande si l'économie réalisée par l'utilisation de short au lieu de long est significative. [:petrus75]

n°1210422
Emmanuel D​elahaye
C is a sharp tool
Posté le 29-09-2005 à 08:42:30  profilanswer
 

Elmoricq a écrit :

Et puis, bon, je me demande si l'économie réalisée par l'utilisation de short au lieu de long est significative. [:petrus75]


Probablement pas, surtout qu'il est possible que ça rajoute du code de conversion...


Message édité par Emmanuel Delahaye le 29-09-2005 à 08:42:57

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
mood
Publicité
Posté le 29-09-2005 à 08:42:30  profilanswer
 

n°1210431
0x90
Posté le 29-09-2005 à 08:53:10  profilanswer
 

bha sur une plateforme 16bits, surement que si :ange:
 
( C'est peut-être l'avantage de certains types C99 qui sont plus explicites pour éviter le doute, t'as besoin du type le plus rapide d'au moins 16bits non signé : uintfast16_t ;) )
( je dis peut-être, j'ai jamais eu l'occasion de tester le C99 et de voir si c'etait bien utile )


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1210439
chrisbk
-
Posté le 29-09-2005 à 09:04:18  profilanswer
 

ouais la vous fourrez des mouches par la face sud, hein ? [:dawao]

n°1210442
0x90
Posté le 29-09-2005 à 09:08:42  profilanswer
 

je sais que ca existe, jme demandais juste si ca pouvait servir a kkchose...
( comme 2-3 autres truc en C99 ^^ )


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.

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

  récupérer des entiers depuis un paramètre de la fonction main

 

Sujets relatifs
PHP5 - Récupérer la variable d'une URL pour requête dans un flux XMLVB Excel - Renommer fichier en fonction du répertoire
[C#] Récupérer la valeur OUTPUT d'une procédure stockée...Besoin d'un petit coup de main pour vba
[RESOLU]Fonction Excel STXTouvrir un fichier protégé via Http avec une fonction PHP
Comment récupérer des données html sur un site ?Fonction. Cas spécial avec arguments facultatifs. Que faire ? :/
CSS IE mini prob...déjà vu mais jarrive pas à mettre la main dessusRecuperer plusieurs ROWS SQL avec une fonction PHP ?
Plus de sujets relatifs à : récupérer des entiers depuis un paramètre de la fonction main


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