Langage C - Utiliser des chaînes de caractères
1) Rappel
En langage C, une chaîne de caractères (string) de longueur n est contenue dans un tableau de n+1 caractères indicés de 0 à n. Ce tableau contient les n caractères de la chaîne suivis d’un caractère nul '\0' de fin de chaîne. Si le tableau possède une taille supérieure à n+1, les cases de ce tableau situées après le caractère de fin de chaîne ne sont prises en compte par le compilateur.
char s[10] = "Bonjour";
Exemple
/************************************************** source: test.c compilation: gcc -Wall test.c -o test exécution: ./test.c ******************************************************/ #include <stdio.h> #include <string.h> int main () { char s[10] = "Bonjour"; printf("%s", s); printf("\n"); printf("%c", s[0]);printf("\n"); printf("%c", s[6]);printf("\n"); printf("%d", s[7]);printf("\n");//caractère de fin de chaine return (0); }
ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$ gcc -Wall test.c -o test ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$ ./test Bonjour B r 0 ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$
2) Déclarer une chaîne de caractères
Les chaines de caractères peuvent être déclarées de diverses façons. Les trois façons suivantes sont souvent utilisées. Les deux premières présentent l'avantage de ne pas utiliser de pointeurs.
char s[10]="Bonjour"; char s[10]; strcpy(s, "Bonjour"); char* s; s="Bonjour";
Exemple
/************************************************** source: test.c compilation: gcc -Wall test.c -o test exécution: ./test.c ******************************************************/ #include <stdio.h> #include <string.h> int main () { char s1[10] = "Bonjour"; printf("%s", s1); printf("\n"); printf("%c", s1[0]);printf("\n"); printf("%c", s1[6]);printf("\n"); printf("%d", s1[7]);printf("\n"); char s2[10]; strcpy(s2, "Bonjour"); printf("%s", s2); printf("\n"); printf("%c", s2[0]);printf("\n"); printf("%c", s2[6]);printf("\n"); printf("%d", s2[7]);printf("\n"); char* s3; s3= "Bonjour"; printf("%s", s3); printf("\n"); printf("%c", s3[0]);printf("\n"); printf("%c", s3[6]);printf("\n"); printf("%d", s3[7]);printf("\n"); return (0); }
ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$ gcc -Wall test.c -o test ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$ ./test Bonjour B r 0 Bonjour B r 0 Bonjour B r 0 ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$
3) Manipuler une chaîne de caractères
On peut manipuler les chaînes de caractères "à la main", c'est à dire caractère par caractère.
Il existe également diverses fonctions permettant de manipuler facilement les chaînes de caractères. Les fonctions suivantes sont souvent utilisées :
• strlen(s) : Retourne la longueur de la chaîne s
• strcpy(s1, s2) : Copie la chaîne s2 dans la chaine s1
• strcat(s1, s2) : Ajoute la chaîne s2 à la fin de la chaîne s1
• strncat(s1,s2,n) : Ajoute les n premiers caractères de la chaîne s2 à la fin de la chaîne s1
• strcmp(s1, s2) : Retourne un nombre: négatif si s1 est inférieur à s2, égal à zéro si s1 est égal à s2 et positif si s1 est supérieur à s2
3.1) Manipuler une chaîne de caractères "à la main"
Exemple
/************************************************** source: test.c compilation: gcc -Wall test.c -o test exécution: ./test.c ******************************************************/ #include <stdio.h> #include <string.h> int main () { char s1[10]; strcpy(s1, "Bonjour"); char s2[10]; strcpy(s2, "Roxane"); printf("%c", s1[3]); printf("\n"); printf("%c", s2[2]); printf("\n"); s1[3]=s2[2]; printf("%s", s1); printf("\n"); return (0); }
ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$ gcc -Wall test.c -o test ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$ ./test j x Bonxour ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$
3.2) Utiliser la fonction strlen(s)
La fonction strlen(s) retourne la longueur d'une chaîne s (sans compter le zéro de fin de chaine).
Exemple
/************************************************** source: test.c compilation: gcc -Wall test.c -o test exécution: ./test.c ******************************************************/ #include <stdio.h> #include <string.h> int main () { int n; char s[10]; strcpy(s, "Bonjour"); n=strlen(s); printf("%s", s); printf("\n"); printf("%d", n); printf("\n"); return (0); }
ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$ gcc -Wall test.c -o test ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$ ./test Bonjour 7 ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$
3.3) Utiliser la fonction strcpy(s1,s2)
La fonction strcpy(s1,s2) copie la chaîne s2 dans la chaine s1.
Exemple
/************************************************** compilation: gcc -Wall test.c -o test exécution: ./test.c ******************************************************/ #include <stdio.h> #include <string.h> int main () { int n; char c; char s1[20]; strcpy(s1, "Bonjour"); char s2[20]; strcpy(s2, "Monsieur"); strcpy(s1,s2); n=strlen(s1); printf("%s", s1); printf("\n"); printf("%d", n); printf("\n"); c=s1[7]; printf("%c", c); printf("\n"); return (0); }
ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$ gcc -Wall test.c -o test ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$ ./test Monsieur 8 r ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$
3.4) Utiliser la fonction strcat(s1,s2)
La fonction strcat(s1,s2) ajoute la chaîne s2 à la fin de la chaîne s1
Exemple
/************************************************** source: test.c compilation: gcc -Wall test.c -o test exécution: ./test.c ******************************************************/ #include <stdio.h> #include <string.h> int main () { int n; char c; char s1[20]; strcpy(s1, "Bonjour"); char s2[20]; strcpy(s2, "Monsieur"); strcat(s1,s2); n=strlen(s1); printf("%s", s1); printf("\n"); printf("%d", n); printf("\n"); c=s1[7]; printf("%c", c); printf("\n"); return (0); }
ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$ gcc -Wall test.c -o test ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$ ./test BonjourMonsieur 15 M ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$
3.5) Utiliser la fonction strncat(s1,s2,n)
La fonction strncat(s1,s2) ajoute les n premiers caractères de la chaîne s2 à la fin de la chaîne s1
Exemple
/************************************************** source: test.c compilation: gcc -Wall test.c -o test exécution: ./test.c ******************************************************/ #include <stdio.h> #include <string.h> int main () { int n; char s1[20]; strcpy(s1, "Bonjour"); char s2[20]; strcpy(s2, "Monsieur"); strncat(s1,s2, 3); n=strlen(s1); printf("%s", s1); printf("\n"); printf("%d", n); printf("\n"); return (0); }
ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$ gcc -Wall test.c -o test ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$ ./test BonjourMon 10 ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$
3.6) Utiliser la fonction strcmp(s1,s2)
La fonction strcmp(s1,s2) retourne un nombre : négatif si s1 est inférieur à s2, égal à zéro si s1 est égal à s2 et positif si s1 est supérieur à s2.
Exemple
/************************************************** source: test.c compilation: gcc -Wall test.c -o test exécution: ./test.c ******************************************************/ #include <stdio.h> #include <string.h> int main () { int n; char s1[20]; strcpy(s1, "Bonjour"); char s2[20]; strcpy(s2, "Monsieur"); n=strcmp(s1,s2); printf("%d", n); printf("\n"); n=strcmp(s2,s1); printf("%d", n); printf("\n"); strcpy(s2, "Bonjour"); n=strcmp(s1,s2); printf("%d", n); printf("\n"); return (0); }
ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$ gcc -Wall test.c -o test ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$ ./test -11 11 0 ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$
4) Créer un tableau de chaînes de caractères
On peut déclarer un tableau t, de N chaînes de caractères, chacune de longueur maximum L, à l'aide de l'instruction suivante:
char t[N][L+1];
On peut ensuite utiliser:
• l'instruction strcpy, pour copier des chaînes de caractères dans les lignes du tableau;
• des instructions du type char s[L+1]; et s=t[i] pour récupérer les lignes du tableau;
• des instruction du type char c; et c=t[i][j]; pour récupérer le caractère situé à la lignes i et à la colonnes j du tableau.
Exemple
/************************************************** source: test.c compilation: gcc -Wall test.c -o test exécution: ./test.c ******************************************************/ #include <stdio.h> #include <string.h> int main(int argc, char *argv[]){ int i; char tc[10000][100]; char s[100]; char c; strcpy(tc[0],"Bonjour"); strcpy(tc[1],"Monsieur"); strcpy(tc[2],"Madame"); strcpy(tc[9999],"9999"); for (i = 0; i < 3; i++) { printf("%s", tc[i]);printf("\n"); } i=9999; printf("%s", tc[i]);printf("\n"); strcpy(s,tc[2]); printf("%s", s);printf("\n"); c=tc[2][0]; printf("%c", c);printf("\n"); return(0); }
ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$ gcc -Wall test.c -o test ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$ ./test ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$Contenu du fichier out.txt :
Bonjour
Monsieur
Madame
9999
Madame
M
5) Copier un tableau de chaînes dans un fichier
On peut, à l'aide d'une boucle for, copier dans un fichier texte (situé dans le répertoire du programme) un ensemble de lignes contenues dans un tableau de chaînes de caractères.
Exemple
/************************************************** source: test.c compilation: gcc -Wall test.c -o test exécution: ./test.c ******************************************************/ #include <stdio.h> #include <string.h> int main(int argc, char *argv[]){ FILE* pout = fopen("out.txt", "w+"); int i; char s[100]; char t[10000][100]; strcpy(t[0],"Bonjour"); strcpy(t[1],"Monsieur"); strcpy(t[2],"Madame"); strcpy(t[4],"quatre"); strcpy(t[5],"5"); for (i=0; i<6; i++) { sprintf(s, "%s", t[i]); strcat(s, "\n"); fputs(s,pout); } fclose(pout); return 0; }
ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$ gcc -Wall test.c -o test ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$ ./test ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$Contenu du fichier out.txt :
Bonjour
Monsieur
Madame
quatre
5
6) Générer une page HTML dotée de centaines ou milliers de liens
On peut, en utilisant des chaînes de caractères, générer automatiquement une page HTML, dotée d'un grand nombre de liens vers des pages nommées 0001.html, 0002.html,...1000.html,…
Exemple
/************************************************** Crée une page html dotée de 1000 liens hypertext Auteur C.Turrier - 2 octobre 2022 source: test.c compilation: gcc -Wall test.c -o test exécution: ./test ******************************************************/ #include <stdio.h> #include <string.h> int main(int argc, char* argv[]) { FILE* pout = fopen("out.txt", "w+"); char line[128]; int i; char mystr[10]; char page[50]; for (i=1; i<1001; i++) { sprintf(mystr, "%d", i); if ((i>0) && (i<10)) { strcpy(page,"000"); strcat(page,mystr); } if ((i>9) && (i<100)) { strcpy(page,"00"); strcat(page,mystr); } if ((i>99) && (i<1000)) { strcpy(page,"0"); strcat(page,mystr); } if ((i>999) && (i<10000)) { strcpy(page, mystr); } strcpy(line,"<a href='"); strcat(line,page); strcat(line,".html'>"); strcat(line, page); strcat(line, "</a> | "); strcat(line, "</br>"); strcat(line, "\n"); fputs(line,pout); } fclose(pout); return 0; }
ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$ gcc -Wall test.c -o test ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$ ./test ubuntu@ubuntu-MS-7C08:/media/ubuntu/data/test$
Contenu du fichier out.txt :