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

Un livre de Wikilivres.
Contenu supprimé Contenu ajouté
Thierry46 (discussion | contributions)
Ajout exercice longueur de chaîne avec strlen
Thierry46 (discussion | contributions)
Ligne 125 : Ligne 125 :
int main(void)
int main(void)
{
{
char reponse[_POSIX_MAX_INPUT];
char reponse[_POSIX_MAX_INPUT];
int lgReponse = 0;
size_t lgReponse = 0;
int codeRetour = EXIT_SUCCESS;
int codeRetour = EXIT_SUCCESS;
char *posCr;
char *posCr;
char *chRetour;
char *chRetour;

(void)puts("Entrez du texte puis la touche Entree,\n"
(void)puts("Entrez du texte puis la touche Entree,\n"
"ou appuyez seulement sur la touche Entree pour arreter");
"ou appuyez seulement sur la touche Entree pour arreter");

do
do
{
{
// Lecture de la chaine au clavier \n inclu
// Lecture de la chaine au clavier \n inclu
chRetour = fgets(reponse, _POSIX_MAX_INPUT, stdin);
chRetour = fgets(reponse, _POSIX_MAX_INPUT, stdin);
if (chRetour != NULL)
if (chRetour != NULL)
{
{
// Suppression du \n final eventuel
// Suppression du \n final eventuel
posCr = strrchr(reponse, '\n');
posCr = strrchr(reponse, '\n');
if (posCr != NULL)
if (posCr != NULL)
{
{
*posCr = '\0';
*posCr = '\0';
}
}

// Calcule la longueur de la chaine
// Calcule la longueur de la chaine
lgReponse = (int)strlen(reponse);
lgReponse = strlen(reponse);
if (lgReponse > 0)
if (lgReponse != 0)
{
{
(void)printf("Vous avez entre la chaine :\n"
(void)printf("Vous avez entre la chaine :\n"
"\t-\"%s\"\n"
"\t-\"%s\"\n"
"\t- %d caractere%s\n",
"\t- %zu caractere%s\n",
reponse, lgReponse,
reponse, lgReponse,
(lgReponse>1) ? "s" : "");
(lgReponse>1) ? "s" : "");
}
}
}
}
else if (ferror(stdin))
else if (ferror(stdin))
{
{
(void)fputs("Probleme de lecture.\n", stderr);
(void)fputs("Probleme de lecture.\n", stderr);
codeRetour = EXIT_FAILURE;
codeRetour = EXIT_FAILURE;
}
}
} while ((chRetour != NULL) && (lgReponse > 0));
} while ((chRetour != NULL) && (lgReponse != 0));

return codeRetour;
return codeRetour;
} // int main(...
} // int main(...
</source>
</source>
Ligne 173 : Ligne 173 :
* 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.
* 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).
* 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>
}} </div>



Version du 21 janvier 2008 à 22:23

Longueur d'une chaîne de caractères (pour manipuler)

Écrire une fonction C calculant la longueur d'une chaîne de caractères, donnée en argument.

A titre d'exercice, pas utiliser la fonction strlen() du fichier d'include string.h.

Longueur d'une chaîne de caractè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 stdio.h.
  • la fonction strlen, ainsi que d'autres si nécessaire, déclarée dans string.h.