Vous êtes sur la page 1sur 4

Programmation en C

Série N°4 (TP/TD) ENSIT


Les chaines de caractères
A.U 2019/2020

Exercice 1 :
Ecrire un programme qui lit une ligne de texte (ne dépassant pas 200 caractères), la mémorise
dans une variable TXT et réalise ensuite les traitements suivants :
a) Afficher la longueur de la chaîne.
b) Déterminer et afficher le nombre de mots contenus dans la chaîne.
c) Afficher la chaine après la transformation de ses caractères saisis en majuscules en
minuscules.

Exercice 2 :
Ecrivez une fonction qui retourne le nombre d'occurrences d'un caractère dans une chaine de
caractères. Utilisez cette fonction dans la fonction principale main pour retourner l’occurrence
de chaque caractère.

Exercice 3 :
Ecrivez un programme qui lit un verbe du premier groupe au clavier et qui en affiche la
conjugaison au présent de l’indicatif de ce verbe. Contrôlez s’il s’agit bien d’un verbe en "er"
avant de conjuguer. Utilisez les fonctions gets, strcat et strlen.

Exercice 4:
Ecrivez un programme qui lit deux chaînes de caractères CH1 et CH2 au clavier et supprime
la première occurrence de CH2 dans CH1. Utilisez uniquement des pointeurs, une variable
logique TROUVE et la fonction strcpy.

Exemples: Alphonse phon ==> Alse


totalement t ==> otalement
abacab aa ==> abacab

1
Programmation en C
Série N°4 (TP/TD) ENSIT
Correction: les chaines de caractères
A.U 2019/2020

Exercice 1 :

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main()
{
/* Déclarations */
char TXT[200]; /* chaîne donnée */
int I; /* indices courants */
int nmot; /* nombre de mots */
int C; /* compteur du nombre d'occurrence de caractère */

/* Saisie des données */


printf("Entrez une ligne de texte:\n");
gets(TXT);

/* a) Compter les caractères */


printf("la longeur de la chaine = %d\n",strlen(TXT));

/* b) Compter le nombre de mots dans la chaine */


nmot=0;
for (I=0;I<strlen(TXT);I++)
if(isspace(TXT[I])) nmot++;

printf("la chaine contient %d mots \n",nmot+1);

/* c) Conversion de majuscule en miniscule */


for (I=0; I<strlen(TXT); I++)
if (isupper(TXT[I])) TXT[I] =tolower(TXT[I]);

puts(TXT);

return 0;
}

Exercice 2:
#include <stdio.h>
#include <string.h>

int compter_occurrences(char car, int taille, char mot[])


{
int compteur = 0, indice;

for(indice=0; indice < taille; indice++)


if(mot[indice] == car)

2
compteur++;

return compteur;
}

int main()
{
int taille; // taille du mot
int i;
int nboccur; // nb d'occurrences de la lettre
char texte[125];

printf("entrez un mot : ");


gets(texte);

taille = strlen(texte);

for(i = 0; i < taille; i++){


nboccur = compter_occurrences(texte[i], taille, texte);
printf("%c apparait %d fois\n", texte[i], nboccur);
}

return 0;
}

Exercice 3:
#include <stdio.h>
#include <string.h>
#define N 20

int main (void)


{
char verbe[N],temp[N];
int l;

do{ printf("Il faut entrer un verbe du premier groupe : ");


gets(verbe);
l=strlen(verbe);
} while( verbe[l-1]!='r' || verbe[l-2]!='e') ;

strcpy(temp,verbe);
temp[l-2] = '\0';
if(temp[0]=='a' || temp[0]=='e' || temp[0]=='i' || temp[0]=='o'
|| temp[0]=='u' || temp[0]=='y')
printf("%s%s\n","j'",strcat(temp,"e"));
else
printf("%s %s\n","je",strcat(temp,"e"));

temp[l-2] = '\0';
printf("%s %s\n","tu",strcat(temp,"es"));
temp[l-2] = '\0';
printf("%s %s\n","il",strcat(temp,"e"));
temp[l-2] = '\0';
printf("%s %s\n","nous",strcat(temp,"ons"));
temp[l-2] = '\0';
printf("%s %s\n","vous",strcat(temp,"ez"));

3
temp[l-2] = '\0';
printf("%s %s\n","ils",strcat(temp,"ent"));

printf("\n");
return 0;
}

Exercice 4:
#include <stdio.h>
#include <string.h>
int main()
{
/* Déclarations */
char CH1[101], CH2[101]; /* chaînes données */
char *P1, *P2; /* pointeurs d'aide dans CH1 et CH2 */
int TROUVE; /* indicateur logique: vrai, si le caractère */
/* actuel dans CH1 a été trouvé dans CH2. */

/* Saisie des données */


printf("Entrez la chaîne à transformer");
gets(CH1);
printf("Entrez la chaîne à supprimer");
gets(CH2);

/* Rechercher CH2 dans CH1 : */


/* L'expression P2-CH2 est utilisée pour déterminer l'indice */
/* de P2 dans CH2. On pourrait aussi résoudre le problème à */
/* l'aide d'un troisième pointeur P3 parcourant CH1. */
TROUVE=0;
for (P1=CH1 ; *P1 && !TROUVE ; P1++)
{
for (P2=CH2 ; *P2 == *(P1+(P2-CH2)) ; P2++)
;
if (!*P2)
TROUVE = 1;
}

/* A la fin de la boucle, P1 est incrémenté, donc */


P1--;
/* Si CH2 se trouve dans CH1, alors P1 indique la position */
/* de la première occurence de CH2 dans CH1 et P2 pointe à */
/* la fin de CH2. (P2-CH2) est alors la longueur de CH2. */
if (TROUVE)
strcpy(P1, P1+(P2-CH2));

/* Affichage du résultat */
printf("Chaîne résultat : \"%s\" \n", CH1);

return 0;
}