31
Hiver 2010 JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Embed Size (px)

Citation preview

Page 1: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

GEF 243BProgrammation Informatique Appliquée

Strings

Page 2: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

Revue

• Que veut-on dire par déréférencer un pointeur?• Étant donné ce qui suit:

int a = 8;int* p;char b = 'v';char* r; p=&a;

• Peut-on faire ceci?r = p;*p=(int)b;

• Qu’est-ce qu’un type dérivé?

Page 3: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

Synopsis

• Les Strings en générale et comment ils sont traités en C

• Les Strings de longueur fixe • Les Strings de longueur variable avec Tableaux• Les Strings de longueur variable avec Pointeurs • Le caractère délimitant• Quelques des fonctions les plus utiles en C pour

les stringsFormatage de sortie

Page 4: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

"Généralités"

• Jusqu’à maintenant nous avons traité les strings de façon superficiel.

• Nous comprenons qu’un string représente une “chose” dans l’environnement que l’on nomme

• Nous nommons les choses pour faire l’abstraction de ce qu’elles sont

• La pluparts des langages fournissent un type spécifique pour les strings tel que Pascal ou Java

• En C on utilise deux types dérivés pour entreposer les stringsTableaux (Arrays)Pointeurs

Page 5: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

"Généralités\0"

• Un string est une unité logique de stockage dérivée du type de stockage physique char

• Ce qui est intéressant avec les strings c’est qu’ils peuvent et doivent varier en longueurSurnom… pas tous de la même longueurMarque de voitureCouleur…

• Comment sélectionnons-nous le bon type dérivé et la structure de données approprié?

Page 6: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

Taxonomie des Strings

• Dans une vue globale, les chaînes de caractères (strings) viennent en deux saveurs: Longueur fixe ou variable

Page 7: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

"Généralités\0"

• Longueur fixe – • Tableau de caractères qui stocke toujours le même nombre de

caractères

char numDeCollege[5]; //code de 5 alphanum• Pointeur à un littéral de longueur fixe

char* province = "ON"; //Abrévi de 2 char

char province[] = "AB"; //3 char array

Page 8: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

"Généralités\0"

• Longueur variable – Tableau de caractères avec délimiteur

char surnom[30] = '\0'; //string vide

surnom[0] = 'B';

surnom[1] = 'e';

surnom[2] = 'a'; //…le reste de mon nom

surnom[8] = 'u';

surnom[9] = '\0'; //J’ai fini

Page 9: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

"Généralités\0"

• Longueur variable – Pointeur à un littéral de longueur maximalchar* nom = "Superfragelisticespialladotious\0";//Ceci est dangereux pcq vous devez trouver //le nom le plus long et planifier l’utilisation

// Le \0 n’est pas requis et est ajouté// automatiquement par le compilateur pour les//double guillemets

• C’est presque identique à char nom[] = "Superfragelisticespialladotious";

Page 10: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

"Généralités\0"

• Dans les deux strings de longueur variable que nous avons utilisé, on a un \0

• \0 est utilisé en C comme arrêt logique pour dire à nos fonctions que nous avons fini.

• Nous aurions pu utiliser n’importe quel caractère dans l’alphabet. ASCII fournit 128 caractères

• Nous aurions pu utiliser un espace ou la lettre a• Mais le caractère n’aurait pas pu être utilisé pour

autre but que de signifier la fin logique du string

Page 11: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

Des choses spéciales pour les strings

Page 12: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

Donc pourquoi dire que un string est un type dérivé logique :

Stockage physique un tableau de 11 char

Stockage logique un string qui finit avec \0

Une chose logique à faire…

Fait partie duTableau mais pas du

string

Page 13: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

Initialisation des strings

• Les strings peuvent être initialisés de la même façon que les autres tableaux avec ou sans dimension ou avec un pointeur

char str[9] = "Good Day";

char str[9] = {'G','o','o','d',' ','D', 'a',

'y'};

char mois[]= "janvier";

char* pStr = "Good Day";

Page 14: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

Des fonctions utiles pour les strings

• de stdio.h printf gets fgets puts fputs

• de string.h strcat strncat strlen itoa

Page 15: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

Formatage de Sorties

• On peut utiliser scanf() pour lire les strings du clavier et printf() pour afficher à l’écranfloat x = 233.12;

printf("La taxe est $%8.2f dollars cette année.\n", x);

La taxe est $233.12 dollars cette année.

int y = 2010;

printf((“La taxe est $%8.2f dollars en %d.\n", x, y);

La taxe est $233.12 en 2010.

Page 16: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

Formatage de Sorties

• Voici les spécifications de format pour scanf() et printf().

Page 17: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

Formatage de Sorties

• Voici les flags et code de conversion pour printf().

Page 18: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

printf() un caractère à la fois

Page 19: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

printf() un caractère à la fois

Page 20: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

Entrée de string• Les fonctions gets() et fgets() prennent une

ligne terminé par \n et la convertissent en string terminé par \0

Page 21: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

Sortie de string• Les fonctions puts() et fputs() prennent une

ligne de la mémoire et l’écrivent à l’écran ou au fichier

Page 22: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

strcpy()• Utilisez strcpy() pour copier un string vers un

autre• Attention à la longueur des strings

Page 23: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

strcmp()• Utilisez strcmp() pour comparer deux strings • Attention à la longueur des strings• retourne 0 si s1==s2• retourne -1 si s1< s2• retourne 1 si s1>s2

Page 24: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

strcat()• Utilisez strcat() pour concaténer deux strings • On peut spécifier combien de char à concaténer

avec strncat()

Page 25: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

La longueur d’un string

• strlen() retourne le nombre de caractères dans un string avant le premier \0

• sizeof() va retourner le nombre de caractères alloués pour le tableau (array)

• NOTE: sizeof() et strlen() ne retourne PAS la même chose!!

Page 26: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

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

int main(int argc, char *argv[]){ char test[25] = "This is a test"; printf(“%s\n”,test); printf("strlen(): %d sizeof %d\

n",strlen(test),sizeof(test)); getch(); return 0;}

La longueur d’un string

Page 27: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

itoa(int value, char *outString, int radix)

• printf, scanf, et sprintf demande beaucoup de mémoire!• Pour les systèmes imbriqués comme le robot les petites

fonctions avec moins de fonctionnalités sont utilisées

itoa(int value, char *outString, int radix)

• Convertie les valeurs integer en string et met le résultat dans outString

• La valeur peut être converti en binaire, décimal, ou hexadécimal comme indiqué par le radix

Page 28: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

itoa(int value, char *outString, int radix)

• outString est un pointeur dans la définition de la fonction

• En appelant itoa(), outString doit pointer à de la mémoire allouée

{

char* convertedInt;

itoa(17,convertedInt,10);

}

/* Erreur pas de mémoire allouée */

{

char* convertedInt[10];

itoa(17,convertedInt,10);

}

//OK

Page 29: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

Danger Will Robinson!

• Aucune des fonctions vérifie si vous avez assez de mémoire allouée!

• Vous pouvez causer un Écrasement du noyau sur la brique si vous écrivez sur un string qui est initialisée ou trop court!

• En Dev-C++ vous allez avoir un erreur d’exécution si vous allez en dehors d’un tableau de char!

• En Dev-C++ c’est beaucoup plus facile de déboguer un programme avec des pointeurs!!!

Page 30: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

Il y a bien plus de fonctions pour les string

• Forouzan Appendice F• Ou le site gnu

http://www.gnu.org/software/libc/

• Faites un recherche sur votre ordi ou google pour les fonctions de string

• \0 est votre ami et il fonctionne.• Vérifiez les fonctions de string dur le site web du

cours et lisez les descriptions avant la prochaine période de labo.

Page 31: Hiver 2010JGA Beaulieu GEF 243B Programmation Informatique Appliquée Strings

Hiver 2010 JGA Beaulieu

Quiz Time

• Quelles sont les deux types de strings• Pourquoi dit-on que les strings sont un type dérivé

logique?• Comment est-ce que le stockage logique est

implémenté?• Donnez le code pour convertir la valeur integer

127 en string décimal.