« Exercices en langage C/Chaines » : différence entre les versions
m <source> -> <syntaxhighlight> (phab:T237267) |
Aucun résumé des modifications |
||
Ligne 3 : | Ligne 3 : | ||
Écrire une fonction C calculant la longueur en octets d'une chaîne de caractères, donnée en argument. |
Écrire une fonction C calculant la longueur en octets d'une chaîne de caractères, donnée en argument. |
||
À titre d'exercice, pas utiliser la fonction <code>strlen()</code> du fichier d'entête [[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 30 : | Ligne 30 : | ||
Ici, on a choisi de retourner la valeur -1 si le pointeur est nul. |
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 <code>for</code>: |
La boucle de recherche de l'élément nul peut être aussi écrite avec un <code>for</code> : |
||
<syntaxhighlight lang="c"> |
<syntaxhighlight lang="c"> |
||
#include <stdlib.h> |
#include <stdlib.h> |
||
Ligne 52 : | Ligne 52 : | ||
/* |
/* |
||
Nom ....... : lg.c |
Nom ....... : lg.c |
||
Role ...... : Compte le nombre de caractères d'une |
Role ...... : Compte le nombre de caractères d'une chaîne constante |
||
Compilation : gcc -Wall -o lg.exe lg.c |
Compilation : gcc -Wall -o lg.exe lg.c |
||
Exécution . : ./lg.exe |
Exécution . : ./lg.exe |
||
Ligne 77 : | Ligne 77 : | ||
int nb=0; |
int nb=0; |
||
char *C; |
char *C; |
||
C = " |
C = "Chaîne de caractères constante"; |
||
nb = longueur(C); |
nb = longueur(C); |
||
(void)printf("Le nombre de |
(void)printf("Le nombre de caractères est de : %d\n", nb); |
||
return EXIT_SUCCESS; |
return EXIT_SUCCESS; |
||
} |
} |
||
Ligne 97 : | Ligne 97 : | ||
== Longueur d'une chaîne de caractères (par une fonction) == |
== Longueur d'une chaîne de caractères (par une fonction) == |
||
Écrire un programme ''lgChaine.c'' : |
Écrire un programme ''lgChaine.c'' : |
||
* qui lit des |
* qui lit des chaînes 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 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). |
* 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). |
||
Ligne 110 : | Ligne 110 : | ||
Nom ...... : lgChaine.c |
Nom ...... : lgChaine.c |
||
Auteur ... : Thierry46 |
Auteur ... : Thierry46 |
||
Rôle ..... : Lit des chaînes et affiche leur longueur. |
|||
Paramètres : non pris en compte. |
Paramètres : non pris en compte. |
||
Code retour : 0 (EXIT_SUCCESS) |
Code retour : 0 (EXIT_SUCCESS) |
||
Pour produire un |
Pour produire un exécutable avec le compilateur libre GCC : |
||
gcc -Wall -std=c99 -o lgChaine.exe lgChaine.c |
gcc -Wall -std=c99 -o lgChaine.exe lgChaine.c |
||
Pour exécuter, tapez : ./lgChaine.exe |
Pour exécuter, tapez : ./lgChaine.exe |
||
Ligne 133 : | Ligne 133 : | ||
char *chRetour; |
char *chRetour; |
||
(void)puts("Entrez du texte puis la touche |
(void)puts("Entrez du texte puis la touche Entrée,\n" |
||
"ou appuyez seulement sur la touche |
"ou appuyez seulement sur la touche Entrée pour arrêter"); |
||
do |
do |
||
{ |
{ |
||
// Lecture de la |
// Lecture de la chaîne 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 |
// Suppression du \n final éventuel |
||
posCr = strrchr(reponse, '\n'); |
posCr = strrchr(reponse, '\n'); |
||
if (posCr != NULL) |
if (posCr != NULL) |
||
Ligne 149 : | Ligne 149 : | ||
} |
} |
||
// Calcule la longueur de la |
// Calcule la longueur de la chaîne |
||
lgReponse = strlen(reponse); |
lgReponse = strlen(reponse); |
||
if (lgReponse != 0) |
if (lgReponse != 0) |
||
{ |
{ |
||
(void)printf("Vous avez entre la |
(void)printf("Vous avez entre la chaîne :\n" |
||
"\t-\"%s\"\n" |
"\t-\"%s\"\n" |
||
"\t- %zu |
"\t- %zu caractère%s\n", |
||
reponse, lgReponse, |
reponse, lgReponse, |
||
(lgReponse>1) ? "s" : ""); |
(lgReponse>1) ? "s" : ""); |
||
Ligne 163 : | Ligne 163 : | ||
else if (ferror(stdin)) |
else if (ferror(stdin)) |
||
{ |
{ |
||
(void)fputs(" |
(void)fputs("Problème de lecture.\n", stderr); |
||
codeRetour = EXIT_FAILURE; |
codeRetour = EXIT_FAILURE; |
||
} |
} |
Version du 15 avril 2022 à 16:17
Longueur d'une chaîne de caractères (pour manipuler)
Écrire une fonction C calculant la longueur en octets d'une chaîne de caractères, donnée en argument.
À titre d'exercice, pas utiliser la fonction strlen()
du fichier d'entête 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 chaîne 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 = "Chaîne de caractères constante";
nb = longueur(C);
(void)printf("Le nombre de caractères 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 chaînes 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
Rôle ..... : Lit des chaînes et affiche leur longueur.
Paramètres : non pris en compte.
Code retour : 0 (EXIT_SUCCESS)
Pour produire un exécutable 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];
size_t lgReponse = 0;
int codeRetour = EXIT_SUCCESS;
char *posCr;
char *chRetour;
(void)puts("Entrez du texte puis la touche Entrée,\n"
"ou appuyez seulement sur la touche Entrée pour arrêter");
do
{
// Lecture de la chaîne au clavier \n inclu
chRetour = fgets(reponse, _POSIX_MAX_INPUT, stdin);
if (chRetour != NULL)
{
// Suppression du \n final éventuel
posCr = strrchr(reponse, '\n');
if (posCr != NULL)
{
*posCr = '\0';
}
// Calcule la longueur de la chaîne
lgReponse = strlen(reponse);
if (lgReponse != 0)
{
(void)printf("Vous avez entre la chaîne :\n"
"\t-\"%s\"\n"
"\t- %zu caractère%s\n",
reponse, lgReponse,
(lgReponse>1) ? "s" : "");
}
}
else if (ferror(stdin))
{
(void)fputs("Problème 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 (octet) 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
strlen
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.