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 :

Boucle de saisie de chaines de caractères


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de mailbox
    Profil pro
    Inscrit en
    Février 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 140
    Par défaut Boucle de saisie de chaines de caractères
    Yop,

    Alors, j'ai une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int saisie (int argc, char *argv[], int *tirage)
    {
    ...
    }
    Et dedans j'essaye de donner des valeurs à argv[1], argv[2], ..., argv[7] comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    i=1;
     
    do
    {
        scanf("%s", &argv[i]);
        i++;
    }while (i <= 7);
    ça compile et quand je lance :
    "Blabla.exe a rencontré un problème et doit fermer. Nous vous prions de nous excuser..."

    Bref, ça plante dès que j'ai appuyé sur Entrée après une première saisie

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 185
    Billets dans le blog
    157
    Par défaut
    Bonjour,

    Il faut savoir que:
    - argc: contient le nombre d'arguments passés au programme
    - argv: contient les arguments passés au programme
    - arge: contient les variables d'environnement (souvent, on en a rien à faire)

    Lorsque l'on tape la commande:
    ./monProgramme

    argc est égale à 1
    argv[0] contient 'monProgramme'

    Si je tape la commande:
    ./monProgramme coucou

    argc est égale à 2
    argv[0] contient 'monProgramme'
    argv[1] contient 'coucou'

    Voilà. Donc lorsque je vois que vous voulez remplir argv, alors que c'est une variable qui est constante ... cela va en choquer plus d'un.

    ----
    Sinon je me suis peut être un peu emballé ... mais j'imagine qu'il vous manque un malloc() pour allouer la mémoire dans laquelle vous allez mettre les valeurs de l'utilisateur (scanf()).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre confirmé Avatar de mailbox
    Profil pro
    Inscrit en
    Février 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 140
    Par défaut
    Bonjour, en fait il y a deux cas d'utilisation pour ma fonction :

    1. Les 7 arguments ont été rentrés en ligne de commande, et dans ce cas ca marche.

    2. Aucun argument n'a été entré et dans ce cas j'aimerai qu'ils soient saisies à la main (avec la boucle que j'ai posté plus haut)

    Et c'est donc le deuxième cas qui me pose problème, je met i=1 justement pour ne pas modifier argv[0] qui a forcément une valeur. Dans la suite du code, je fais quelques tests sur ces arguments et les stock (ou non) dans un autre tableau. Donc j'essaye de remplir "manuellement" ces argv si ca n'a pas été fait en ligne de commande car je les utilise après

    (J'espère être clair ><)

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 185
    Billets dans le blog
    157
    Par défaut
    C'est un peu plus clair (surtout après ma confusion)

    L'histoire est, comme je l'ai dit, que argv est un tableau qui ne doit pas être modifié.
    Votre problème est (je pense) qu'il vous manque un malloc / realloc sur agv (ce que je déconseillerai en fait)
    Donc la solution que je propose est:
    - Dans le cas où vous avez vos arguments (passé au programme) vous copier les arguments dans un autre tableau (que vous envoyez aux fonctions qui s'en servent)
    - L'utilisateur ne rentre pas les arguments, vous créez un tableau (le même que celui cité au dessus, et qui sera passée aux fonctions) et vous le remplissez avec des scanf.

    Par contre, le scanf est plutot dangereux ... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    scanf("%s", &argv[i]);
    Ici, nous ne savons pas ce que va taper l'utilisateur, du coup, nous ne savons pas la taille du tableau alloué ... du coup, il y a un gros risque de bug (très gros, avec faille de sécurité d'ailleurs).
    Voici une solution: http://c.developpez.com/faq/index.ph...scanf_vs_fgets
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    citation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    i=1;
    do
    {
        scanf("%s", &argv[i]);
        i++;
    }while (i <= 7);
    Moi je crois surtout que argv[i] est un pointeur, donc
    2 points supplémentaires
    1- j'appuie LittelWrite à propos de gets() + sscanf()
    2- la boucle do ... while est correcte, mais dans le cas présent, je préférerais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      for (int i=0; i<7; i++)
      {
        ...
      }

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    @LittleWhite :
    Donc lorsque je vois que vous voulez remplir argv, alors que c'est une variable qui est constante
    Non, les chaines concernées par le paramètre argv de main() sont modifiables.

    @mailbox :
    L'argument est erronné : c'est argv[i] qui est l'adresse de destination :
    Encore faut-il que le tableau de destination existe. Si on passe à la fonction le paramètre argv de main(), c'est assuré lorsque le programme est lancé avec des arguments sur la ligne de commande (mais le nombre de caractères entrés doit être inférieur ou égal à celui de l'argument de la ligne de commande). Par contre, si il n'y a pas d'argument sur la ligne de commande, il n'y a pas de tableau correspondant et ça plante.

  7. #7
    Membre confirmé Avatar de mailbox
    Profil pro
    Inscrit en
    Février 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 140
    Par défaut
    hm j'ai essayé comme ca :

    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
    20
    21
    22
    23
    24
    25
    26
     
    char tableau[20];
    char ligne[20];
    int i=1;
     
    //Cas sans arguments en ligne de commande
    if (argc == 1)
    {
        printf("Entrez les 7 arguments :\n");
        for (i=1; i<=7; i++)
        {  
            fgets(ligne, sizeof ligne, stdin);
            strcpy(tableau[i], ligne);
        }
    }
     
    //Cas nombre d'arguments compris entre 1 et 6
    else if (argc != 7)
        return 0;
     
    //Cas avec les 7 arguments en ligne de commande
    else
    {
        for (i=1; i<=7; i++)
            strcpy(tableau[i], argv[i]);
    }
    et j'ai eu la même erreur, je saisie un premier mot, j'appuie sur entrée -> plantage :'o

  8. #8
    Membre confirmé Avatar de mailbox
    Profil pro
    Inscrit en
    Février 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 140
    Par défaut
    J'ai changé la déclaration de "tableau" et ca a l'air de marcher...je comprends pas pourquoi >.<

    au lieu de :


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

Discussions similaires

  1. Conversion chaine de caractère + contrôle de saisie
    Par Kalika07 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 07/02/2013, 09h31
  2. Concatener chaine de caractère pour path dans boucle
    Par Stepsbysteps dans le forum MATLAB
    Réponses: 1
    Dernier message: 22/10/2012, 18h24
  3. [XL-2010] Boucle qui ne reconnait pas deux chaines de caractère égales
    Par Lison Lisette dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 25/09/2012, 22h49
  4. Réponses: 0
    Dernier message: 20/12/2011, 07h55
  5. Programmer une boucle de saisie chaine de caractère.
    Par Spike Spiegel dans le forum C
    Réponses: 30
    Dernier message: 02/10/2005, 18h46

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