IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

[Débutant] Implémentation commande echo


Sujet :

C

  1. #1
    Membre éclairé Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Points : 770
    Points
    770
    Par défaut [Débutant] Implémentation commande echo
    bonjour,

    alors voilà je débute en C car je dois l'apprendre dans le cadre d'un cours d'architecture des systèmes d'exploitation .

    alors un petit énoncé de tp était de faire une implémentation de la commande echo (shell) en C sauf qu'elle devait se baser sur l'entrée standard (pas comme la commande echo justement) .

    J'ai tout de suite pensé à un bête passage par argument comme ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /* Implementation de la commande echo en C */
     
    #include <stdio.h>
     
    int main(int argc, char *argv[])
    {
       int i;
       for (i=1; i < argc; i++)
         { printf("%s ",argv[i]); }
       printf("\n");
       return 0;
    }
    mais la redirection d'entrée standard ne fonctionne pas, tout comme pour la commande echo .

    exemple:

    ./eko bonjour

    me donne bien : bonjour

    mais ./eko < bonjour.txt

    où bonjour.txt contient bonjour
    ne me donne rien

    c'est logique en fait je crois vu que je passe par argument mais y à t'il moyen de prendre en compte cette redirection quand même?

    merci

  2. #2
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Bonjour,

    exemple:
    ./eko bonjour
    me donne bien : bonjour

    mais ./eko < bonjour.txt
    où bonjour.txt contient bonjour
    ne me donne rien
    Comme tu dis, c'est normal.

    Pour que l'entrée standard soit prise en compte, il faudrait que tu la lises (par un fgets par exemple).
    Pour t'aider, tu peux jeter un oeil ici : http://emmanuel-delahaye.developpez....tes.htm#saisie

    Tu peux regarder s'il y a des arguments, alors tu les affiches; et sinon, tu lis l'entrée standard et tu affiches ce que tu as lu.

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Tuxico
    mais ./eko < bonjour.txt
    C'est ce fonctionnement que tu veux ?

    Alors il n'y a rien à faire d'autre que d'écrire du code pour 'stdin'.

    Ce qu'il faut comprendre, c'est que sur la ligne de commande, '< fichier' n'est pas un paramètre mais une indirection qui est gérée par ton système (tu devrais connaitre un peu mieux l'utilisation de ton système, sinon, tu vas tout mélanger...).

    C'est lui qui va ouvrir le fichier en lecture texte et se substituer au stdin par défaut (ton clavier, par exemple).

    Un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       int c;
       while ((c = getchar()) != EOF)
       {
          putchar (c);
       }
    devrait suffire.

    (Ca doit être l'un des premiers exercices du K&R...)

  4. #4
    Membre éclairé Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Points : 770
    Points
    770
    Par défaut
    merci à vous,

    le problème est que maintenant si je tape :

    ./eko bonjour

    il attend une entrée clavier avant de la renvoyer, hors je vuex qu'il affiche directement bonjour comme avant .

    exemple de ce qu'il fait maintenant :

    ./eko bonjour
    hello
    hello

    ce que je veux :

    ./eko bonjour
    bonjour

    pour la redirection d'entrée, ça marche

    merci. (désolé pour ces bêtes question, mais apsser du pascal au C, ca change )

  5. #5
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par Tuxico
    le problème est que maintenant si je tape :
    ./eko bonjour
    il attend une entrée clavier avant de la renvoyer, hors je vuex qu'il affiche directement bonjour comme avant .
    Teste le nombre d'arguments (argc). S'il y en a au moins un, affiches-les. Sinon, "attend une entrée clavier".

  6. #6
    Membre éclairé Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Points : 770
    Points
    770
    Par défaut
    oui c'est ce que j'ai fait en attendant ta réponse merci à toi et à Emmanuel

  7. #7
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par Tuxico
    oui c'est ce que j'ai fait en attendant ta réponse merci à toi et à Emmanuel
    Et ça marche ?
    Si oui, penses au tag RESOLU.
    Si non, poste le code, qu'on y jette un oeil.

  8. #8
    Membre éclairé Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Points : 770
    Points
    770
    Par défaut
    en fait non, parlé trop vite...

    j'ai essayé plusieurs modifications mais il ne prends pas la reidrection d'entrée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <stdio.h>
     
    int main(int argc, char *argv[])
    {
      if(argc >= 1)
      {
        int i;
        for(i=1; i<argc; i++) { printf("%s ",argv[i]); }
      }
      else
      {
        int c;
        while ((c = getchar()) != EOF)
        {
          putchar (c);
        }
      }
    return 0;
    }
    je ne vois pas d'erreur, en fait il 'nexécute pas le else...

    merci

  9. #9
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Il y a toujours au moins un argument, argv[0] qui contient une approximation plus ou moins bonne du nom du programme.

  10. #10
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par Tuxico
    je ne vois pas d'erreur, en fait il 'nexécute pas le else...
    Je crois que argc vaut toujours au moins 1, non ?

  11. #11
    Membre éclairé Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Points : 770
    Points
    770
    Par défaut
    oui argv[0] est le nom du programme
    argv[1] le premier parametre etc...

    il faudrait plutot que je teste sur argv[1] alors?
    mais quel test effectuer? car le caractere "<" n'est pas pris en compte comme argument


    merci

  12. #12
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par Tuxico
    oui argv[0] est le nom du programme
    argv[1] le premier parametre etc...

    il faudrait plutot que je teste sur argv[1] alors?
    mais quel test effectuer?
    Ben...

  13. #13
    Membre éclairé Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Points : 770
    Points
    770
    Par défaut


    sorry manque de sommeil


    merci

    si ca peut servir voici donc le code final :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <stdio.h>
     
    int main(int argc, char *argv[])
    {
      if(argc > 1)
      {
        int i;
        for(i=1; i<argc; i++) { printf("%s ",argv[i]); }
      }
      else
      {
        int c;
        while ((c = getchar()) != EOF)
        {
          putchar (c);
        }
      }
    return 0;
    }

  14. #14
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Ton code ne gere pas les cas limites suivants:
    (il attend un EOF explicite de l'utilisateur)
    et
    (l'indirection n'est pas prise en compte).
    Il est egalement plus propre de mettre un retour a ligne apres l'affichage de la liste des arguments:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for(i=1; i<argc; i++)
    {
      printf("%s ",argv[i]);
    }
    printf("\n");

  15. #15
    Membre éclairé Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Points : 770
    Points
    770
    Par défaut
    Ton code ne gere pas les cas limites suivants:

    Code :

    eko
    En effet, je règle cela .


    eko arg < file.in
    pas demandé

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] implémentation d'Iterator
    Par nanath02 dans le forum Langage
    Réponses: 5
    Dernier message: 08/03/2007, 12h42
  2. Aide avec commande ECHO
    Par lafmart dans le forum Langage
    Réponses: 1
    Dernier message: 04/02/2007, 06h06
  3. [Batch][Débutant] Date et echo
    Par venomelektro dans le forum Windows
    Réponses: 2
    Dernier message: 19/08/2006, 14h38
  4. Réponses: 7
    Dernier message: 17/05/2006, 12h20
  5. Comment aller a la ligne avec la commande ECHO
    Par juflata dans le forum Windows
    Réponses: 3
    Dernier message: 23/06/2004, 17h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo