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 :

affectation dans une variable d'un argument passé au programme


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juin 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Juin 2014
    Messages : 219
    Par défaut affectation dans une variable d'un argument passé au programme
    J'ai un programma prog.exe qui nécessite des arguments pour son lancement. (prog.exe 30)
    Ces arguments sont des nombres.

    Je souhaite rajouter un argument qui doit être une chaine de caractères (nom du fichier à générer pour la sauvegarde des données) je voudrais lancer mon nouveau programme comme suit (prog.exe mon_fichier 30)

    Actuellement, mon code ressemble a ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    double gradient_chauff = 600.0;
     
    int main(int argc, char* argv[])
    {
    	// Lecture arguments
    	int i = 1;
    	gradient_chauff = atof(argv[i++]);
    Et pour rajouter l'argument souhaité, je le modifie comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    char nom_echantillon[50] = "SansNom" ;
    double gradient_chauff = 600.0;
     
    int main(int argc, char* argv[])
    {
    	// Lecture arguments
    	int i = 1;
    	nom_echantillon = (argv[i++]);
    	gradient_chauff = atof(argv[i++]);
    Bien entendu, je me fais jeter lors de la compilation !
    Je suis assez persuadé que c'est une histoire de pointeur, mais suis incapable de m'en sortir, même en ayant lu pas mal de chose.

  2. #2
    Membre chevronné

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Mars 2015
    Messages : 294
    Par défaut
    Bonjour, en C pour copier une chaine de caractères dans une autre il faut utiliser la fonction strcpy (cf duckduckgo ou qwant.com) et non pas une affectation.....

  3. #3
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Pour être précis, nom_echantillon est un tableau, qui ne peut pas du tout être affecté, tandis que argv[i++] est un char *, un pointeur de caractère.
    on peut remplir nom_echantillon avec les premiers caractères trouvés en partant de celui qui est pointé, mais il faut le faire assez intelligemment.

    Comme argv contient des données arbitraires venant de l'utilisateur, celles-ci ne sont pas limité à une taille arbitraire (comme le 50).
    Je recommande donc de recourir à strncpy, qui ne copie qu'un certain nombre de caractères, et dont la documentation se trouve par exemple dans la partie C de cppreference.com

  4. #4
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Citation Envoyé par ternel Voir le message
    Je recommande donc de recourir à strncpy, qui ne copie qu'un certain nombre de caractères, et dont la documentation se trouve par exemple dans la partie C de cppreference.com
    Attention : strncpy n'est pas une version défensive de strcpy et peut produire un résultat qui n'est pas une chaîne de caractères C. On peut toutefois s'en servir comme telle sous réserve de comprendre le comportement de la fonction dans ses moindres détails. Je le reformule encore une fois : strncpy n'est pas à strcpy ce que snprintf est à sprintf.

    L'approche défensive de la copie de chaînes est implémentée par strlcpy (non standard).

  5. #5
    Membre confirmé
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juin 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Juin 2014
    Messages : 219
    Par défaut
    Dois je écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    char nom_echantillon[] = "SansNom" ;
    double gradient_chauff = 600.0;
     
    int main(int argc, char* argv[])
    {
    	// Lecture arguments
    	int i = 1;
    	strncpy (nom_echantillon, (argv[i++], 30);
    	gradient_chauff = atof(argv[i++]);
    Je n'y comprend absolument rien ! Je ne peux pas exploiter la documentation, c'est totalement incompréhensible pour moi et les exemple donnés ne me parle pas.

  6. #6
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Et je te rassure, c'est tout-à-fait normal lorsque l'on débute. C'est aussi parce que tu essaies de mettre la charrue avant les bœufs : relis la première partie du cours de C et les exercices de base sur les chaînes de caractères, posément.

  7. #7
    Membre chevronné

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Mars 2015
    Messages : 294
    Par défaut
    cela serait plutot deja cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    char nom_echantillon[31] = "SansNom" ;
    double gradient_chauff = 600.0;
     
    int main(int argc, char* argv[])
    {
    	// Lecture arguments
    	int i = 1;
    	strncpy (nom_echantillon, (argv[i++], 30);
    	gradient_chauff = atof(argv[i++]);
    si tu veux copier 30 caracteres dans nom_echantillon.de plus n'oublie pas de mettre un au debut du fichier C

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/06/2014, 14h18
  2. Réponses: 3
    Dernier message: 06/09/2006, 09h06
  3. Affecter valeur d'un champ dans une variable
    Par Sly2k dans le forum Access
    Réponses: 3
    Dernier message: 17/08/2006, 09h43
  4. Affectation d'une variable dans un état
    Par tamerlan dans le forum Access
    Réponses: 26
    Dernier message: 04/04/2006, 09h09
  5. Réponses: 2
    Dernier message: 19/01/2006, 21h59

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