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 après déclaration d'une chaine


Sujet :

C

  1. #1
    Membre habitué
    Homme Profil pro
    root
    Inscrit en
    Janvier 2013
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : root

    Informations forums :
    Inscription : Janvier 2013
    Messages : 174
    Points : 144
    Points
    144
    Par défaut Affectation après déclaration d'une chaine
    Salut à tous.
    Encore une question de débutant.

    J'aimerais faire quelque chose de ce style avec une chaine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char texte[50];
    texte = "salut";
    Cela ne marche pas, il faut manuellement faire des crochets un par un et/ou utiliser une boucle.
    Mais y aurait-il pas un moyen plus efficace ?

    Comme:
    Enfin si ça existe j'aimerais connaître la méthode, merci d'avance.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        char* str1  = "Bonjour";
        char str2[] = "Bonjour";
        char str3[] = {'B', 'o', 'n', 'j', 'o', 'u', 'r', '\0'};
     
    //  str1[2] = 'Z'; // Segfault
        str2[2] = 'Z';
        str3[2] = 'Z';
     
        printf("%s\n%s\n%s\n", str1, str2, str3);
    Il faut tester mais en théorie str1 est une chaîne de caractère qu'on ne peut pas modifier, str2 et str3 des tableaux qu'on ne peut par rajouter des cases.
    Pour str3 ne pas oublier le caractère vide '\0'.
    Et on peut indiquer les tailles entre les crochets

  3. #3
    Membre habitué
    Homme Profil pro
    root
    Inscrit en
    Janvier 2013
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : root

    Informations forums :
    Inscription : Janvier 2013
    Messages : 174
    Points : 144
    Points
    144
    Par défaut
    Oui mais on peut pas faire en 2 étapes ?
    En ayant un tableau de beaucoup de case qu'on ne dépassera pas.

    d'abord:
    puis un truc du genre:
    Au lieu de faire:
    puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    texte[0] = 's';
    texte[1] = 'a';
    texte[2] = 'l';
    texte[3] = 'u';
    texte[4] = 't';
    texte[5] = '\0';

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        char* str1  = "Bonjour";
        char* str4 = (char*) malloc(sizeof(char) * (strlen(str1) + 1));
        strcpy(str4, str1);
     
        printf("%s\n", str4);
     
        free(str4);
    la fonction strcpy, <- dans la documentation c'est écrit qu'elle, rajoute le caractère vide '\0' terminal
    la fonction strlen, <- dans la documentation c'est écrit qu'elle, ne compte pas le caractère vide '\0' terminal

    Édit: en C on peut ne pas caster le retour de la fonction malloc

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    ↑Ce n'est pas qu'on ne peut pas, juste qu'on n'est pas censé le faire, car ça cause plus de problèmes que ça n'en résout.

    Autre note: Je confirme, une chaîne littérale n'est pas modifiable. Alors, pourquoi n'est-elle pas naturellement const? Par compatibilité parce qu'ils s'en sont rendu compte trop tard, c'est la seule raison.

    Heureusement, ceux qui compilent avec gcc peuvent restaurer le comportement tel qu'il aurait dû être: L'option de compilation -Wwrite-strings rend les chaînes littérales const, ce qui causera un warning sur char* str1 = "Bonjour";On résoudra alors le warning en changeant la déclaration:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    char const* str1  = "Bonjour";
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kripteks Voir le message
    Oui mais on peut pas faire en 2 étapes ?
    En ayant un tableau de beaucoup de case qu'on ne dépassera pas.

    d'abord:
    puis un truc du genre:
    Au lieu de faire:
    puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    texte[0] = 's';
    texte[1] = 'a';
    texte[2] = 'l';
    texte[3] = 'u';
    texte[4] = 't';
    texte[5] = '\0';
    Bonjour

    En te lisant on sent que tu as bien compris qu'une chaine en C est un truc déjà très complexe pour ce langage si bas niveau. Tellement complexe qu'il ne sait pas les manipuler et qu'il n'est pas capable d'exécuter un truc style texte="salut" ou if (texte == "salut") (dans les deux cas ce qu'il fait n'est pas ce que tu aimerais qu'il fasse).

    Donc en effet tu es obligé pour le premier cas de remplir ton tableau caractère par caractère. Et dans le second, comparer chaque caractère du tableau avec chaque caractère de la chaine demandée.

    Fort heureusement, ces opérations fastitdieuses ont été prévues par les créateurs du langage qui ont offert aux développeurs des fonctions déjà toutes faites exécutant ces manipulations. La première se nomme strcpy() (string copy) et la seconde strcmp() (string compare). Tu peux donc les utiliser à loisir chaque fois que tu auras besoin de copier une chaine dans une autre, ou de comparer deux chaines. Et en fouillant la doc tu en trouveras plein d'autres qui feront des travaux divers extraction/recherche/concatenation, etc.

    Donc pour répondre à ta question, c'est à la fois oui et non. Oui on peut le faire en 2 étapes tel que tu le souhaites et non on ne peut pas éviter de travailler caractère par caractère quand on manipule une chaine. Toutefois on n'est pas obligé d'écrire nous-même les traitements car ceux-ci ont déjà été écrits et sont disponibles. Simplement ne faut pas oublier que même quand tu écris
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char texte[50]; 
    strcpy(texte, "salut")
    et que tu as l'impression que ton code fait bien tes deux étapes telles que demandé, derrière lui il y aura la fonction strcpy() qui, elle, transformera ta seconde étape en 6 affectations (ne pas oublier le '\0') distinctes comme si c'était toi qui les avait écrites.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre actif

    Homme Profil pro
    autodidacte
    Inscrit en
    Mars 2011
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Mars 2011
    Messages : 95
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    ...car ça cause plus de problèmes que ça n'en résout.
    Un cast créerait plus de problèmes qu'il n'en résoud. Que veux-tu dire par là ?
    Toujours à adapter le problème à la structure de la machine, mais se soigne pour faire l'inverse.

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Ça a déja été abordé, mais disons pour simplifier que ce cast-là résout exactement zéro problèmes, et que dans de rares circonstances impliquant certaines plate-formes et certaines options d'un compilateur mal configuré, il peut cacher un problème rare pouvant causer des troncatures de pointeur ou carrément des retours d'une valeur indéterminée.

    C'est presque négligeable, mais ça reste supérieur à zéro, les inconvénients surpassent donc les avantages.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lautrec1 Voir le message
    Un cast créerait plus de problèmes qu'il n'en résoud. Que veux-tu dire par là ?
    http://www.developpez.net/forums/d50...retour-malloc/.

    PS: le smiley "roll" que tu as utilisé est assez péjoratif. il signifie grosso-modo "comment peut-on écrire de telles stupidités".
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [WD12] Lenteur affectation de texte dans une chaine
    Par zouzoukha dans le forum WinDev
    Réponses: 2
    Dernier message: 21/04/2012, 21h26
  2. Réponses: 12
    Dernier message: 25/07/2009, 16h59
  3. Réponses: 5
    Dernier message: 06/10/2007, 11h33
  4. Réponses: 4
    Dernier message: 11/06/2007, 16h28
  5. Réponses: 4
    Dernier message: 12/03/2006, 20h47

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