« Exercices en langage C/Chaines » : différence entre les versions

Ajout exercice longueur de chaîne avec strlen
(Ajout exercice longueur de chaîne avec strlen)
{{Exercices en langage C}}
== LesLongueur chaînesd'une chaîne de caractères (pour manipuler) ==
 
== Longueur d'une chaîne de caractère ==
Écrire une fonction C calculant la longueur d'une chaîne de caractères, donnée en argument.
 
NeA titre d'exercice, pas utiliser la fonction strlen() du fichier d'include [[w:en:string.h|string.h]].
 
<div style="width:70%; float:left">{{Boîte déroulante|titre=Solution|contenu =
Le nombre de caracteres est de : 30
</pre>
 
}} </div>
 
== Longueur d'une chaîne de caractèrecaractères (par une fonction) ==
Écrire un programme ''lgChaine.c'' :
* qui lit des chaines de caractères tapées au clavier (flux stdin);
* qui calcule la longueur de chaque chaîne entrée et l'affiche ainsi que sa longueur;
* qui s'arrête si l'utilisateur ne frappe que la touche Entrée ou si le fichier est fini (Ctrl-D tapé par l'utilisateur).
 
Vous utiliserez :
* une des fonctions déclarée dans [[w:en:stdio.h|stdio.h]].
* la fonction <code>strlen</code>, ainsi que d'autres si nécessaire, déclarée dans [[w:en:string.h|string.h]].
 
<div style="width:70%; float:left">{{Boîte déroulante|titre=Solution|contenu =
<source lang="c">
/*
Nom ...... : lgChaine.c
Auteur ... : Thierry46
Role ..... : Lit des chaines et affiche leur longueur.
Paramètres : non pris en compte.
Code retour : 0 (EXIT_SUCCESS)
Pour produire un executable avec le compilateur libre GCC :
gcc -Wall -std=c99 -o lgChaine.exe lgChaine.c
Pour exécuter, tapez : ./lgChaine.exe
Version : 1.0 du 14/1/2008
Licence : GNU GPL
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
int main(void)
{
char reponse[_POSIX_MAX_INPUT];
int lgReponse = 0;
int codeRetour = EXIT_SUCCESS;
char *posCr;
char *chRetour;
 
(void)puts("Entrez du texte puis la touche Entree,\n"
"ou appuyez seulement sur la touche Entree pour arreter");
 
do
{
// Lecture de la chaine au clavier \n inclu
chRetour = fgets(reponse, _POSIX_MAX_INPUT, stdin);
if (chRetour != NULL)
{
// Suppression du \n final eventuel
posCr = strrchr(reponse, '\n');
if (posCr != NULL)
{
*posCr = '\0';
}
 
// Calcule la longueur de la chaine
lgReponse = (int)strlen(reponse);
if (lgReponse > 0)
{
(void)printf("Vous avez entre la chaine :\n"
"\t-\"%s\"\n"
"\t- %d caractere%s\n",
reponse, lgReponse,
(lgReponse>1) ? "s" : "");
}
}
else if (ferror(stdin))
{
(void)fputs("Probleme de lecture.\n", stderr);
codeRetour = EXIT_FAILURE;
}
} while ((chRetour != NULL) && (lgReponse > 0));
 
return codeRetour;
} // int main(...
</source>
 
'''Remarques''' :
* L'utilisation de <code>fgets</code> est plus sûre que <code>gets</code> ou <code>scanf</code> : fgets permet de limiter le nombre de caractère lu et de ne pas déborder de la variable ''reponse''. Les débordements mémoire sont une source d'erreur fréquente en C.
* Ce programme peut ne pas donner les résultats attendus si on redirige sur l'entrée standard un fichier comportant des terminateurs de ligne \r (Mac).
}} </div>
 
[[Catégorie:Exercices en langage C (livre)]]
227

modifications