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

(Ajout exercice longueur de chaîne avec strlen)
int main(void)
{
char reponse[_POSIX_MAX_INPUT];
int size_t 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
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- %dzu 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>
* 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).
* La fonction <code>strlen</code> de string.h retourne une valeur de type size_t : type non signée donc toujours >=0, unsigned int ou unsigned long selon l'implémentation.
}} </div>
 
227

modifications