Upload
veronique-launay
View
106
Download
0
Embed Size (px)
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.