« GLib/GLib Data Types » : différence entre les versions

Contenu supprimé Contenu ajouté
Page créée avec « {{Chapitre | titre = GLib Data Types | idfaculté = informatique | numero = 6 | précédent = ../GLib Utilities/ }} == GString == GString est un type ... »
(Aucune différence)

Version du 15 juillet 2011 à 22:40

Début de la boite de navigation du chapitre
GLib Data Types
Icône de la faculté
Chapitre no {{{numéro}}}
Leçon : GLib
Chap. préc. :GLib Utilities
fin de la boite de navigation du chapitre
En raison de limitations techniques, la typographie souhaitable du titre, « GLib : GLib Data Types
GLib/GLib Data Types
 », n'a pu être restituée correctement ci-dessus.

GString

GString est un type proposé par la GLib, qui encapsule un "char*" standard. L'intérêt est de profiter d'une API autour de ce type, permettant de:

  • Gérer une chaine de taille dynamique sans s'occuper de l'allocation mémoire
  • Faire intuitivement un certain nombre d'opérations classiques (append, prepend, insertion à un index donné...)

Créez un nouveau fichier source C avec les includes suivants:

#include <stdio.h>
#include <stdlib.h>
#include <glib.h>

Grâce à la GLib, nous pouvons gérer proprement une entrée de taille dynamique sans nous préoccuper de la gestion de la mémoire.

g_string_new est une fonction permettant d'initialiser une structure GString. Elle prend en paramètre un pointeur "char*" classique. g_string_append et g_string_prepend permettent d'ajouter à la fin ou au début d'une GString la chaine donnée en argument.

Écrivons une fonction lisant une entrée de taille dynamique depuis l'entrée standard, et retournant un pointeur vers la structure GString correspondante:

GString* gstring_getLineFromStdin() {
	char c = (char) 0;
	GString* str = g_string_new( "" );
	c = getchar();
	while( (c != '\r') && (c != '\n') && (c != EOF) ) {
		// g_string_append_c ajoute le caractère donné à une GString
		// l'allocation mémoire est gérée par la GLib
		str = g_string_append_c(str,c);
		c = getchar();
	}
	return str;

}

Voyons comment utiliser des GString. Pour cela, écrivons un main:

int main(int argc, char* argv[]) {

g_string_new prend en parametre un char* et renvoie un pointeur vers une structure GString.

	GString* strCas = g_string_new("cas");
	// le membre str de cette structure est un pointeur char* standard */
	printf("strCas=%s\n", strCas->str);

La fonction g_string_append concatene une GString avec la chaine donnée en argument. L'allocation mémoire est gérée par la GLib.

	strCas = g_string_append(strCas,"soulet");
	printf("strCas=%s\n", strCas->str);

La fonction g_string_prepend rajoute la chaine donnée en argument au début d'une GString.

	GString* strBurger = g_string_new("burger");
	strBurger = g_string_prepend(strBurger,"ham");
	printf("strBurger=%s\n", strBurger->str);

Utilisons la fonction que nous avons écris plus haut:

	printf("saisissez votre nom: ");
	GString* nom = gstring_getLineFromStdin();
	printf("Bonjour %s!\nTaille de votre nom: %i\n",nom->str, nom->len);

g_string_free libère la mémoire occupée. Le deuxième argument détermine si le champ str de la GString sera libéré aussi. Si c'est False, il est retourné par la fonction, afin qu'on puisse en disposer.

	g_string_free(nom,TRUE);
	return 0;
}