C++ struct et les chaînes de caractères

Résolu
Bonsoir à tous,
ça a l'air stupide mais j'arrive pas à mettre une chaîne de caractère dans une structure!

#include "stdafx.h"
#include <cstdlib>

int main(void)
{
	typedef struct { char machin[50]; } test;
	test abc;
	abc.machin="test";
	printf("%s\n", abc.machin);
	std::system("PAUSE");
}


L'erreur :
1>c:\users\....cpp(12) : error C2440: '=' : impossible de convertir de 'const char [5]' en 'char [50]'


merci d'avance,
Dorian

2 réponses

  1. Contributeur
    Bonjour,

    En C/C++, tu ne peux utiliser l'opérateur d'affectation (=) pour affecter une chaîne de caractère qu'à la déclaration.
    Donc :
    char machin[10];
    machin="test"; /*erreur, celle que tu as*/
    

    mais
    char machin[10]="test"; /*ok, ça marche*/
    


    Si tu souhaites affecter le tableau machin par la suite, il te faudra utiliser la fonction strcpy (ou strncpy, mieux sécurisé).
    Ce qui donnera : strcpy(machin, "test");
    Mais en C++, on évite généralement d'utiliser les tableaux de char (utilisé en C) puisque le paradigme objet a permis la création de la classe "string". Cette dernière te permettra d'utiliser le signe d'affectation.

    Si tu souhaites plus de précision, n'hésite pas.

    Cdlt,
    1. Merci, strcpy fonctionne
      Par contre, si j'utilise
       typedef struct { std::string machin; } test;

      le signe d'affectation n'a pas l'air de faire effet : le prinft affiche (null)
    2. Salut,
      je suis pas expert en c++, mais pourquoi ne pas utiliser cout au lieu de printf??
      #include <iostream> 
      #include <string> 
      using namespace std; 
      int main(void) 
      { 
       typedef struct { string machin; } test; 
       test abc; 
       abc.machin="Hello"; 
       cout<<abc.machin<<endl; 
      return 0;
      } 
      

      sinon pour printf, cela devrait faire l'affaire...:
      #include <iostream> 
      #include <string> 
      using namespace std; 
      int main(void) 
      { 
       typedef struct { string machin; } test; 
       test abc; 
       abc.machin="Hello"; 
       printf("%s\n",(char*)&abc.machin[0]); 
      return 0;
      } 
      

      @+
    3. chuka, ton code est magique =]
      mais je crois bien que je vais utiliser cout maintenant. Quel bordel pour afficher une string
    4. Contributeur
      De toute façon, il ne fuat pas confondre C et C++ ;-).
      En C++, on utilise plutôt cout (au lieu de printf), cin (au lieu de scanf), string (au lieu de char []), etc.
      Cdlt,
  2. Salut !

    Ta chaine ne fait que 5 caractères par rapport à la déclaration 50 caractères. (4 lettres + une).

    Je ne me rappelle plus de ce qu'il faut faire, mais essaies avec une allocation normale, avec le string de Qt par exemple, ou alors fais en sorte que la longueur soit dynamique ...

    Excuse-moi si je me trompe :S
    1. Contributeur
      Utiliser une bibliothèque graphique pour une chaîne de caractère ? :D.
    2. Tu rigoles mais Qt a une excellente classe pour le string.
    3. Contributeur
      Je sais bien que sa classe est excellente. Je dis juste qu'utiliser Qt juste pour gérer ça, c'est inutile ^^.