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

Langage de programmation C - Chaine de caractères (string)

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>&nbsp;&nbsp;|&nbsp;&nbsp;");
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 :
02