Bonsoir,

Pour m'entraîner un peu en C (il paraît que c'est en pratiquant qu'on apprend) j'ai essayé de créer une fonction lisant les caractères saisis aux claviers et les copiant dans une chaine prévue à cet effet. Je sais bien qu'il existe des fonctions pour ça, je crée celle-ci uniquement pour m'entraîner.

Elle comprend deux paramètres : la chaîne cible (où on va écrire) et sa taille (pour éviter de déborder).

Le but de la fonction est uniquement de saisir une chaîne de caractères, je ne m'intéresse pas pour l'instant à convertir la chaine saisie en entier ou en flottant.

Voici le code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 
// lire_chaine.c
 
#include <stdlib.h>
#include <stdio.h>
#include "lire_chaine.h"
 
/*
lireChaine
Lit une chaine de caractères.
Retourne EXIT_SUCCESS si tout se passe bien
Retourne EXIT_FAILURE si la taille de la chaine saisie est supérieure
à celle de la chaine cible.
 
Paramètre 1 : la chaine cible
Paramètre 2 : la taille de cette chaine
*/
 
int lireChaine(char* chaine, long taille)
{
    char buffer[300] = {0}; // Le buffer qui va recevoir la chaine tappée
    char caractereLu = 0; // La variable qui reçoit les caractères un a un
    long i = 0; // Pour les boucles
 
    /* Tant qu'on a pas entré de retour à la ligne et tant qu'on ne dépasse
    pas la taille de la chaine dans laquelle on veut écrire, on continue
    de recevoir les caractères entrants  */
    while ((caractereLu = getchar()) != '\n' && i <= taille)
    {
        buffer[i] = caractereLu;
        i++;
    }
 
    /* Si la taille de la chaine dans laquelle on veut écrire a été dépassée,
    on écrit une erreur et on retourne un échec */
    if (i-1 >= taille)
    {
        fprintf(stderr, "Erreur : la taille de la chaine saisie depasse celle de la chaine cible.\n");
        return EXIT_FAILURE;
    }
 
    /* Si on a pas dépassé la taille de la chaine dans laquelle on veut écrire,
    on ajoute le caractere NULL au buffer et on copie vers la chaine */
    buffer[i] = '\0';
    strcpy(chaine, buffer);
 
    /* Tout s'est bien passé, on retourne EXIT_SUCCESS */
    return EXIT_SUCCESS;
}
Je l'ai testé avec ce code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
// main.c
 
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[])
{
    char chaine[20] = {0};
 
    printf("Entrez une chaine : ");
    fflush(stdout);
 
    if (lireChaine(chaine, 20) == EXIT_SUCCESS)
    {
        printf("La chaine est : \"%s\" et contient %d caracteres", chaine, strlen(chaine));
    }
 
 
 
   return EXIT_SUCCESS;
}
Ce qui me donne à l'écran :

Entrez une chaine : Chaine de test
La chaine est : "Chaine de test" et contient 14 caracteres
Donc apparament, elle fonctionne bien.
Pourriez-vous m'indiquer si la fonction que j'ai créée a des défauts ?
Si oui, lesquels ?
Comment pourrais-je l'améliorer ?

Par avance, merci.