Aide Programmation C Arguments - C - Programmation
Marsh Posté le 14-02-2010 à 15:35:05
br3yton a écrit :
|
Peut-être. Mais comme le test dont tu parles n'est demandé nulle-part dans l'énoncé tel que tu nous as écrit...
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?
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+,
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
Marsh Posté le 15-02-2010 à 18:49:08
br3yton a écrit : Merci pour vos réponses |
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...
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 :
|
A+,
Marsh Posté le 16-02-2010 à 19:43:57
gilou a écrit : Ah. Avec l'énoncé complet, c'est plus clair.
|
Ensuite on peut affiner en mettant des exit(1) dans les cas de mauvaise utilisation...
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+,
Marsh Posté le 17-02-2010 à 19:07:00
gilou a écrit : Ah. Avec l'énoncé complet, c'est plus clair.
|
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
Marsh Posté le 17-02-2010 à 21:00:45
br3yton a écrit : |
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...
Marsh Posté le 18-02-2010 à 01:21:45
Tu listes tous les devices commençant par tty et tu fais un write dessus
/gros bourrin.
Marsh Posté le 18-02-2010 à 10:46:47
br3yton a écrit : |
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+,
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