[résolu] parcours d'un char** sans connaitre le nombre de chaines

parcours d'un char** sans connaitre le nombre de chaines [résolu] - C - Programmation

Marsh Posté le 11-06-2009 à 14:30:15    

Bonjour à tous !
Voilà le prototype de la fonction que j'ai écrite :

Code :
  1. char * extract_options(char **args_list, char *valid_options);


Sans entrer dans les détails (ce n'est pas ça l'important), la fonction parcours args_list et repère les options (qui commencent par '-') valides, et renvoie la chaine contenant toutes les options trouvées, et NULL si une option était invalide.
 
Pour parcourir args_list, j'ai fait comme ceci :

Code :
  1. for (int n = 0 ; *args_list != NULL ; args_list++)


Ça marche très bien, mais je me demande ce qu'il se passerait si il y avait en mémoire quelque chose juste après args_list, c'est à dire, une fois qu'il a incrémenté args_list pour la dernière fois (normalement) si il peut il y avoir autre chose que NULL. En gros est-il possible d'avoir un débordement mémoire ?
 
Pour tester cette fonction, dans main j'envoie argv+2 et argv[1] comme arguments.
 
Si comme premier argument j'envoie quelque chose comme :

Code :
  1. char *args_list[4] = {"-abc", "arg", "-x", NULL};


Alors là je sais qu'il n'y aura pas de problèmes, mais il faut que la fonction puisse fonctionner dans le cas où NULL n'est pas explicitement écrit à la fin.
 
D'avance merci pour vos éclaircissements.


Message édité par swilmet le 11-06-2009 à 16:27:54
Reply

Marsh Posté le 11-06-2009 à 14:30:15   

Reply

Marsh Posté le 11-06-2009 à 14:32:03    

Pourquoi ne pas utiliser getopt(3) [:pingouino dei]


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box, and replicate and expand beyond their wildest dreams by throwing away the limits imposed by overbearing genetic r
Reply

Marsh Posté le 11-06-2009 à 14:40:34    

C'est pas pour utiliser dans un vrai logiciel, c'était juste un exercice pour m'entrainer ;) Sinon j'aurais utilisé getopt oui en effet.

Reply

Marsh Posté le 11-06-2009 à 15:36:32    

Il y a deux méthodes :
 
- Soit le nombre de paramètres (argument en anglais) est donné (par exemple int main(agrc, agv[]...)),
- Soit un repère est indiqué (par exemple deux caractères nuls qui se suivent).
 
Ce sont des conventions qui dépendent de ce qui a été décidé.
 
Sinon, si on dépasse les bornes, il n'y a plus de limites.

Reply

Marsh Posté le 11-06-2009 à 15:48:56    

Ah ok merci, le plus simple alors est que je rajoute un paramètre en plus pour le nombre de chaines.
Et sinon est-ce que argv a un repère à la fin ? Ou bien il faut toujours utiliser argc ?

Reply

Marsh Posté le 11-06-2009 à 16:02:15    

swilmet a écrit :

Ah ok merci, le plus simple alors est que je rajoute un paramètre en plus pour le nombre de chaines.
Et sinon est-ce que argv a un repère à la fin ? Ou bien il faut toujours utiliser argc ?


Il faut utiliser argc.


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box, and replicate and expand beyond their wildest dreams by throwing away the limits imposed by overbearing genetic r
Reply

Marsh Posté le 11-06-2009 à 16:24:56    

Ok merci, il me semblait bien que c'était pas tout à fait propre la manière dont je faisais.

Reply

Marsh Posté le 11-06-2009 à 17:12:29    

swilmet a écrit :

Ah ok merci, le plus simple alors est que je rajoute un paramètre en plus pour le nombre de chaines.
Et sinon est-ce que argv a un repère à la fin ? Ou bien il faut toujours utiliser argc ?


Pour les paramètres de main(int argc, char *argv[]), le langage C garantit que argv[argc] vaut NULL.


Message édité par Emmanuel Delahaye le 11-06-2009 à 17:13:21

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

Sujets relatifs:

Leave a Replay

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