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

  FORUM HardWare.fr
  Programmation
  C

  Aide Programmation C Arguments

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Aide Programmation C Arguments

n°1965858
br3yton
Posté le 14-02-2010 à 14:45:50  profilanswer
 

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  
 

mood
Publicité
Posté le 14-02-2010 à 14:45:50  profilanswer
 

n°1965865
Sve@r
Posté le 14-02-2010 à 15:35:05  profilanswer
 

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.
n°1965870
Gigathlon
Quad-neurones natif
Posté le 14-02-2010 à 15:52:09  profilanswer
 

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

n°1966001
olivthill
Posté le 15-02-2010 à 10:55:27  profilanswer
 

Le test peut se faire avec un strcmp().

n°1966155
gilou
Modérateur
Modzilla
Posté le 15-02-2010 à 15:43:38  profilanswer
 

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é!  --
n°1966183
br3yton
Posté le 15-02-2010 à 17:12:50  profilanswer
 

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

n°1966240
Sve@r
Posté le 15-02-2010 à 18:49:08  profilanswer
 

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.
n°1966395
gilou
Modérateur
Modzilla
Posté le 16-02-2010 à 10:01:58  profilanswer
 

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é!  --
n°1966609
Sve@r
Posté le 16-02-2010 à 19:43:57  profilanswer
 

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.
n°1966822
gilou
Modérateur
Modzilla
Posté le 17-02-2010 à 12:00:07  profilanswer
 

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é!  --
mood
Publicité
Posté le 17-02-2010 à 12:00:07  profilanswer
 

n°1966977
br3yton
Posté le 17-02-2010 à 19:07:00  profilanswer
 

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

n°1966992
Sve@r
Posté le 17-02-2010 à 21:00:45  profilanswer
 

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.
n°1967046
WiiDS
20 titres en GC, 0 abandon, 0 DQ
Posté le 18-02-2010 à 01:21:45  profilanswer
 

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
n°1967115
gilou
Modérateur
Modzilla
Posté le 18-02-2010 à 10:46:47  profilanswer
 

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

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

  Aide Programmation C Arguments

 

Sujets relatifs
Aide Tableau JavaProgrammation Jade
Besoin de votre aide : exécuter avec les droits admins ?Identification utilisateur en C#
Mastermind en algo puis en CComparaison VB 6.0 / C#
Aide avec le "boutisme"Besoin d'aide : éxécuter avec les droits admin + précision a respecter
[C++] Spécialisation d'une fonction template un peu tordue...Aide en Java
Plus de sujets relatifs à : Aide Programmation C Arguments


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