salut je voudrais savoir comment donner une valeur a un gchar
j'ai essayé ce code là mais il ne marche pas :
et je voudrais aussi svoir s(il est possible de comparer 2 gchar ; si oui comment ?Code:
1
2
3gchar cle; cle = "azerty123";
Version imprimable
salut je voudrais savoir comment donner une valeur a un gchar
j'ai essayé ce code là mais il ne marche pas :
et je voudrais aussi svoir s(il est possible de comparer 2 gchar ; si oui comment ?Code:
1
2
3gchar cle; cle = "azerty123";
Ton problème est lié à la méconnaissance du C.
gchar toto; => toto est un entier signé codé sur 1 octet.
gchar *toto; => toto est un pointeur sur un espace mémoire de la taille d'un octet.
Si tu désires allouer un espace suffisant pour un texte, il faudra passer par les pointeurs. On pourrait écrire gchar *toto="Voici le texte". Cette méthode n'est pas vraiment idéale. Même certains compilateurs sont capables de te mettre un warning sur ce genre de déclaration.
Si tu connais ton texte par avance autant le déclarer en constant : const gchar *toto="Voici le texte".
Maintenant si la taille du texte est fluctuante, alors tu peux passer par la fonction g_strdup_printf();. Cette fonction alloue de la mémoire dans le tas. donc il faudra une fois son utilisation devenue obsolète libérer la mémoire avec la fonction g_free();.
Pour compléter la réponse de gérald, les formes correctes pour allouer une chaîne dans la pile sont:
Code:const gchar *text1 = "bonjour";
Code:gchar text2[] = "bonjour";
La première méthode utilise un pointeur vers une chaine de caractères. Le contenu doit forcément être déclaré en const, car le compilateur tentera de placer la chaîne dans un segment de l'exécutable qui sera en lecture seule (segment .rodata - read only data dans le format ELF [ame="http://en.wikipedia.org/wiki/Executable_and_Linkable_Format"]ELF[/ame] des binaires Linux). Si tu essaies de modifier ce texte, tu auras une erreur de segmentation.Code:gchar *text3 = g_strdup ("bonjour");
La deuxième méthode utilise est un tableau de caractères. Il s'agit d'un tableau alloué dans la pile, la chaîne peut donc être modifiée comme toute valeur se trouvant dans la pile, du moment que tu ne dépasses pas les limites imposées par la taille initiale du tableau (ici, 8 octets, 7 pour les lettres de bonjour, + 1 pour le caractère de fin de chaîne).
Enfin, la troisième méthode utilise un pointeur et alloue le texte dans le tas. g_strdup ne fait qu'allouer de la mémoire et copier la chaine qui lui est passée en paramètre dans cette mémoire nouvellement allouée. g_strdup_printf est utilisée quand la chaine à allouer peut varier, par exemple :
À noter que sizeof (text1) vaut sizeof (char *), soit 4 octets en 32 bits (la taille d'un pointeur), idem pour text3 et text4. En revanche, text2 étant un tableau, sizeof (text2) = 8, qui est ici la taille du tableau.Code:
1
2 int n_choux = 3; char *text4 = g_strdup_printf ("j'ai mangé %d choux", n_choux);
Et pour comparer 2 chaines de caractères :
Si tu travailles en ASCII, et que la casse est importante (différence entre majuscules et minuscules):
Si tu travailles en ASCII, mais que la casse n'est pas importante:Code:g_ascii_strcmp
Si tu travailles en UTF-8, il faut d'abord appeler :Code:g_ascii_strcasecmp
Ensuite, à partir de la chaine qu'a renvoyé cette fonction, tu peux utiliser les fonctions strcmp (prend en compte la case) et strcasecmp (ignore la casse) de la bibliothèque C standard.Code:g_utf8_strcasefold