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

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

Marsh Posté le 28-09-2005 à 13:01:39    

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 ?

Reply

Marsh Posté le 28-09-2005 à 13:01:39   

Reply

Marsh Posté le 28-09-2005 à 13:12:20    

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/
Reply

Marsh Posté le 28-09-2005 à 13:22:14    

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
Reply

Marsh Posté le 28-09-2005 à 13:35:06    

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

Reply

Marsh Posté le 28-09-2005 à 13:48:05    

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
Reply

Marsh Posté le 28-09-2005 à 13:56:50    

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/
Reply

Marsh Posté le 28-09-2005 à 15:15:31    

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
Reply

Marsh Posté le 28-09-2005 à 23:21:11    

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.
Reply

Marsh Posté le 29-09-2005 à 07:01:36    

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

Reply

Marsh Posté le 29-09-2005 à 08:42:30    

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/
Reply

Marsh Posté le 29-09-2005 à 08:42:30   

Reply

Marsh Posté le 29-09-2005 à 08:53:10    

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.
Reply

Marsh Posté le 29-09-2005 à 09:04:18    

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

Reply

Marsh Posté le 29-09-2005 à 09:08:42    

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.
Reply

Sujets relatifs:

Leave a Replay

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