GEF 243B Programmation Informatique Appliquée Strings §11.1 - 11.3

Preview:

Citation preview

GEF 243BProgrammation Informatique Appliquée

Strings

§11.1 - 11.3

4/11/23 2

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é?

4/11/23 3

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

4/11/23 4

"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

4/11/23 5

"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é?

4/11/23 6

Taxonomie des Strings

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

4/11/23 7

"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* province1 = "ON"; //Abrévi de 3 char

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

4/11/23 8

"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

4/11/23 9

"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";

4/11/23 10

"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

4/11/23 11

Des choses spéciales pour les strings

4/11/23 12

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

4/11/23 13

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";

4/11/23 14

Des fonctions utiles pour les strings

• de stdio.h printf gets fgets puts fputs

• de string.h strcat strncat strlen itoa

4/11/23 15

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.

4/11/23 16

Formatage de Sorties

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

4/11/23 17

Formatage de Sorties

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

4/11/23 18

printf() un caractère à la fois

4/11/23 19

printf() un caractère à la fois

4/11/23 20

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

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

4/11/23 21

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

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

4/11/23 22

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

autre• Attention à la longueur des strings

4/11/23 23

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

4/11/23 24

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

avec strncat()

4/11/23 25

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!!

4/11/23 26

#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

4/11/23 27

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

4/11/23 28

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

4/11/23 29

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!!!

4/11/23 30

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.

4/11/23 31

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.

Recommended