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


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
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.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
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