« Exercices en langage C/Chaines » : différence entre les versions
m →Longueur d'une chaîne de caractère : erreur lien |
Ajout exercice longueur de chaîne avec strlen |
||
Ligne 1 : | Ligne 1 : | ||
{{Exercices en langage C}} |
{{Exercices en langage C}} |
||
== |
== 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. |
É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 [[w:en:string.h|string.h]]. |
|||
<div style="width:70%; float:left">{{Boîte déroulante|titre=Solution|contenu = |
<div style="width:70%; float:left">{{Boîte déroulante|titre=Solution|contenu = |
||
Ligne 93 : | Ligne 91 : | ||
Le nombre de caracteres est de : 30 |
Le nombre de caracteres est de : 30 |
||
</pre> |
</pre> |
||
}} </div> |
}} </div> |
||
⚫ | |||
É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)]] |
[[Catégorie:Exercices en langage C (livre)]] |
Version du 15 janvier 2008 à 22:31
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.
La fonction doit recevoir une chaîne de caractères. Une chaîne de caractères en C est un tableau de caractères, finissant par le caractère nul. La fonction doit donc recevoir un pointeur vers le premier élément du tableau, de type char *, et chercher l'élément nul.
La fonction recevant un pointeur, il faut donc s'assurer qu'il est valide. On doit donc tester si le pointeur est nul ou non avant de regarder ce qui se trouve dans le tableau de caractères.
#include <stdlib.h>
int longueur(char *s)
{
int n = -1;
if (s != NULL)
{
n = 0;
while (s[n] != '\0')
{
n++;
}
}
return n;
}
Ici, on a choisi de retourner la valeur -1 si le pointeur est nul.
La boucle de recherche de l'élément nul peut être aussi écrite avec un for:
#include <stdlib.h>
int longueur(char *s)
{
int n = -1;
if (s != NULL)
{
for (n = 0; s[n] != '\0'; n++)
{
/* vide */
}
}
return n;
}
Fichier source lg.c :
/*
Nom ....... : lg.c
Role ...... : Compte le nombre de caractères d'une chaine constante
Compilation : gcc -Wall -o lg.exe lg.c
Exécution . : ./lg.exe
*/
#include <stdio.h>
#include <stdlib.h>
int longueur(char *s)
{
int n = -1;
if (s != NULL)
{
n = 0;
while (s[n] != '\0')
{
n++;
}
}
return n;
}
int main(void)
{
int nb=0;
char *C;
C = "Chaine de caracteres constante";
nb = longueur(C);
(void)printf("Le nombre de caracteres est de : %d\n", nb);
return EXIT_SUCCESS;
}
Résultats d'exécution :
MacMini-TM:~/Documents/developpement/c thierry$ ./lg.exe Le nombre de caracteres est de : 30
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.
/*
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(...
Remarques :
- L'utilisation de
fgets
est plus sûre quegets
ouscanf
: 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).