Aide Programmation C Arguments

Aide Programmation C Arguments - C - Programmation

Marsh Posté le 14-02-2010 à 14:45:50    

Bonjour,  
 
J'ai un exercice a réaliser, mais étant assez débutant en C je bute totalement pour réaliser ce qui est demandé, j'ai cependant déja fait une partie  
 
Voila l'énoncé :  
 
Implémenter une commande qui prend comme argument une chaîne de caractères
entre guillemets et l’affiche sur tous les terminaux ouverts.
 
Et voila le code que j'ai déja fait :  
 
#include <stdio.h>
 
int main(int argc, char **argv)
{
 int i;
 
 for(i=1; i<argc; i++)
 {
  printf("%s \n", argv[i]);
 }
 return 0;
}
 
 
Donc concrètement actuellement le programme ne test pas les arguments comme demandé
Il affiche juste l'argument que je lui passe  
 
Merci par avance  
 

Reply

Marsh Posté le 14-02-2010 à 14:45:50   

Reply

Marsh Posté le 14-02-2010 à 15:35:05    

br3yton a écrit :

br3yton a écrit :

Voila l'énoncé :  
 
Implémenter une commande qui prend comme argument une chaîne de caractères
entre guillemets et l’affiche sur tous les terminaux ouverts.


Donc concrètement actuellement le programme ne teste pas les arguments comme demandé


Peut-être. Mais comme le test dont tu parles n'est demandé nulle-part dans l'énoncé tel que tu nous as écrit...


Message édité par Sve@r le 14-02-2010 à 15:36:55

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 14-02-2010 à 15:52:09    

- argc est un int contenant le nombre de paramètres passés
- argv est un tableau de chaînes de caractères, contenant chacune un des arguments.
 
Le code présenté donne donc à l'affichage une liste des arguments sur plusieurs lignes et retourne 0... donc c'est quoi le "test" manquant?

Reply

Marsh Posté le 15-02-2010 à 10:55:27    

Le test peut se faire avec un strcmp().

Reply

Marsh Posté le 15-02-2010 à 15:43:38    

Sauf que il y a un problème avec cet énoncé: Les guillemets ne font pas partie du jeu de caractère ascii de base.
Donc soit il faut faire une programmation dépendante du jeu de caractère (ce dont je doute ici), soit c'est le terme double-quote (ou apostrophe double...) qui aurait du être employé.
Et dans ce cas la, il y a encore des problèmes: le shell (sous Windows en tout cas) bouffe les " autour des arguments et il est impossible de distinguer toto de "toto"  (or d'après l'énoncé, on veut détecter les chaines commençant et finissant par " et celle la seulement  [et si ce n'est pas le cas, c'est que celui qui a pondu le français ne maitrise pas correctement la langue française, parce que 'une chaîne de caractères entre guillemets' ça a un sens précis, et ça veut dire que s'il n'y a pas les guillemets, ce n'est pas un argument valable pour le programme]).
Sous Windows, si on veut vraiment récupérer un argument qui soit une chaine avec des double quotes il faudrait le passer au programme comme "\"....\"" ce dont je doute que ce soit ce qui est désiré ici.
Bref, un énoncé rédigé avec les pieds.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-02-2010 à 17:12:50    

Merci pour vos réponses :)  
 
c'est moi qui est coupé un bout de l'énoncé pour le test :
 
Si votre programme prend des arguments, le nombre d’arguments devra être vérifié
ainsi que leur valeur. En cas de mauvaise utilisation, il faut rappeler sur la sortie erreur
le fonctionnement de votre programme, par exemple : Usage : ./monExe arg1 arg2

Reply

Marsh Posté le 15-02-2010 à 18:49:08    

br3yton a écrit :

Merci pour vos réponses :)  
 
c'est moi qui ai coupé un bout de l'énoncé pour le test :
 
Si votre programme prend des arguments, le nombre d’arguments devra être vérifié
ainsi que leur valeur. En cas de mauvaise utilisation, il faut rappeler sur la sortie erreur
le fonctionnement de votre programme, par exemple : Usage : ./monExe arg1 arg2


 
Oui ben tu testes si argc est supérieur au nombre d'arguments nécessaires.
Pourquoi supérieur et pas "supérieur ou égal" ? Parce que le nom du programme est compté dans argc mais n'est pas un argument de travail. Donc si argc = 1, ça veut dire qu'il n'y a aucun argument...


Message édité par Sve@r le 15-02-2010 à 18:49:24

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 16-02-2010 à 10:01:58    

Ah. Avec l'énoncé complet, c'est plus clair.
Bref, c'est juste un test sur la valeur de argc.
Un truc de ce genre donc:

Code :
  1. #include <stdio.h>
  2.  
  3. void usage(void) {
  4.  printf("Usage: mon-programme.exe \"chaine-en-argument\"\n" );
  5. }
  6.  
  7. int main(int argc, char *argv[]) {
  8.  switch(argc - 1) {
  9.  case 1:  printf("%s \n", argv[1]);
  10.           break;
  11.          
  12.  case 0:  printf("Erreur: pas d'argument\n" );
  13.           usage();
  14.           break;
  15.          
  16.  default: printf("Erreur: trop d'arguments\n" );
  17.           usage();
  18.           break;
  19.  }
  20.  return 0;
  21. }


 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 16-02-2010 à 19:43:57    

gilou a écrit :

Ah. Avec l'énoncé complet, c'est plus clair.
Bref, c'est juste un test sur la valeur de argc.
Un truc de ce genre donc:

Code :
  1. #include <stdio.h>
  2.  
  3. void usage(void) {
  4.  printf("Usage: mon-programme.exe \"chaine-en-argument\"\n" );
  5. }
  6.  
  7. int main(int argc, char *argv[]) {
  8.  switch(argc - 1) {
  9.  case 1:  printf("%s \n", argv[1]);
  10.           break;
  11.          
  12.  case 0:  printf("Erreur: pas d'argument\n" );
  13.           usage();
  14.           break;
  15.          
  16.  default: printf("Erreur: trop d'arguments\n" );
  17.           usage();
  18.           break;
  19.  }
  20.  return 0;
  21. }


 
A+,


 
Ensuite on peut affiner en mettant des exit(1) dans les cas de mauvaise utilisation...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 17-02-2010 à 12:00:07    

En l'occurrence, utiliser exit ici est inutile:

Citation :

As required by the ISO C standard, using return from main() has the same behavior (other than with respect to language scope issues) as calling exit() with the returned value.

Si on veut passer un code d'erreur, il vaut mieux le passer a return et réserver l'usage de exit à une sortie de programme depuis une autre procédure ou fonction que main.
D'autre part, on préfèrera utiliser exit(EXIT_FAILURE) à exit(1).

 

J'ai laissé un "return 0;" à la fin de mon code, pour plus de lisibilité, mais j'aurais aussi pu le supprimer, car je rappelle aussi que:

Citation :

Reaching the end of the main() function has the same behavior as calling exit(0).


A+,


Message édité par gilou le 17-02-2010 à 12:17:46

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 17-02-2010 à 12:00:07   

Reply

Marsh Posté le 17-02-2010 à 19:07:00    

gilou a écrit :

Ah. Avec l'énoncé complet, c'est plus clair.
Bref, c'est juste un test sur la valeur de argc.
Un truc de ce genre donc:

Code :
  1. #include <stdio.h>
  2.  
  3. void usage(void) {
  4.  printf("Usage: mon-programme.exe \"chaine-en-argument\"\n" );
  5. }
  6.  
  7. int main(int argc, char *argv[]) {
  8.  switch(argc - 1) {
  9.  case 1:  printf("%s \n", argv[1]);
  10.           break;
  11.          
  12.  case 0:  printf("Erreur: pas d'argument\n" );
  13.           usage();
  14.           break;
  15.          
  16.  default: printf("Erreur: trop d'arguments\n" );
  17.           usage();
  18.           break;
  19.  }
  20.  return 0;
  21. }


 
A+,


 
C'est excellent ! vraiment merci pour ton aide, je cherche actuellement comment le faire afficher sur tous les terminaux ouverts mais je sais même pas si c'est techniquement possible  
 
Encore merci en tout cas

Reply

Marsh Posté le 17-02-2010 à 21:00:45    

br3yton a écrit :


 
C'est excellent ! vraiment merci pour ton aide, je cherche actuellement comment le faire afficher sur tous les terminaux ouverts mais je sais même pas si c'est techniquement possible


Mouais. Je vois pas trop comment faire.
 
Une ébauche d'idée pourrait-être "who |grep $LOGNAME" ce qui te donnera une liste de lignes contenant tous tes terminaux.
Tu traites cette liste puis pour chaque terminal tu fais fp=fopen(<le_terminal>, "a" ) puis tu remplaces les printf(...) par fprintf(fp, ...)
 
Ca marchotera mais c'est du bricolage...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 18-02-2010 à 01:21:45    

Tu listes tous les devices commençant par tty et tu fais un write dessus :o
 
/gros bourrin.


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Marsh Posté le 18-02-2010 à 10:46:47    

br3yton a écrit :


 
C'est excellent ! vraiment merci pour ton aide, je cherche actuellement comment le faire afficher sur tous les terminaux ouverts mais je sais même pas si c'est techniquement possible  
 
Encore merci en tout cas

Regardes le code source de la commande wall de linux/unix (et du daemon auquel il fait appel, rwalld dont le source est dans rwalld.c) ça te donnera peut être de bonnes idées.
A+,


Message édité par gilou le 18-02-2010 à 11:01:16

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

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