Saisie de chaînes avec scanf
Fait partie de la section Logic & Flow du Journey C de Coddy — leçon 14 sur 63.
Maintenant que vous comprenez comment les chaînes de caractères fonctionnent avec le caractère de fin de chaîne (null terminator), il est temps d'apprendre comment obtenir une saisie de chaîne de la part des utilisateurs. La fonction scanf peut lire des chaînes en utilisant le spécificateur de format %s, mais elle comporte des limitations importantes que vous devez comprendre.
Pour lire une chaîne de caractères avec scanf, vous utilisez le format %s et passez le nom de votre tableau de caractères (sans l'opérateur &, car les noms de tableaux sont déjà des adresses) :
char word[50];
printf("Enter a word: ");
scanf("%s", word);
printf("You entered: %s\n", word);Cependant, scanf("%s", ...) présente une limitation critique : il s'arrête de lire dès qu'il rencontre un caractère d'espacement (espace, tabulation ou saut de ligne). Cela signifie que si un utilisateur tape "Hello World", scanf ne capturera que "Hello" et laissera "World" dans le tampon d'entrée.
Une autre préoccupation sérieuse est que scanf ne vérifie pas si l'entrée tient dans votre tableau. Si quelqu'un saisit un mot plus long que ce que votre tableau peut contenir, cela provoquera un dépassement de tampon (buffer overflow), risquant de faire planter votre programme ou de créer des vulnérabilités de sécurité. Assurez-vous toujours que votre tableau de caractères est assez grand pour l'entrée attendue.
Malgré ces limitations, scanf("%s", ...) est parfaitement adapté à la lecture de mots simples, ce qui est exactement ce que vous allez pratiquer dans le prochain défi.
Défi
FacileÉcrivez un programme en C qui démontre la lecture d'une entrée de chaîne de caractères de l'utilisateur à l'aide de scanf et son affichage en retour. Votre programme doit :
- Déclarer un tableau de caractères nommé
usernameavec 30 éléments pour stocker l'entrée de l'utilisateur - Déclarer un tableau de caractères nommé
hobbyavec 25 éléments pour stocker une autre entrée - Utiliser
printfpour inviter l'utilisateur avec le message "Enter your username:" - Utiliser
scanfavec le spécificateur de format%spour lire le nom d'utilisateur dans le tableauusername - Utiliser
printfpour inviter l'utilisateur avec le message "Enter your hobby:" - Utiliser
scanfavec le spécificateur de format%spour lire le passe-temps dans le tableauhobby - Afficher les deux chaînes à l'aide de
printfdans le format exact indiqué ci-dessous
L'entrée sera fournie sous la forme de deux mots simples distincts (pas d'espaces à l'intérieur de chaque mot).
Votre sortie doit afficher les résultats au format suivant :
Enter your username:
Enter your hobby:
Hello [username], your hobby is [hobby]!Par exemple, si l'utilisateur saisit "Alice" comme nom d'utilisateur et "reading" comme passe-temps, la sortie doit être :
Enter your username:
Enter your hobby:
Hello Alice, your hobby is reading!Ce défi teste votre compréhension de l'utilisation de scanf avec le spécificateur de format %s pour lire une entrée de chaîne, la déclaration correcte d'un tableau de caractères avec une taille suffisante, et la combinaison de l'entrée utilisateur avec une sortie formatée à l'aide de printf.
Aide-mémoire
Pour lire une saisie de chaîne de caractères de la part des utilisateurs, utilisez scanf avec le spécificateur de format %s :
char word[50];
printf("Enter a word: ");
scanf("%s", word);
printf("You entered: %s\n", word);Limitations importantes de scanf("%s", ...) :
- S'arrête de lire à n'importe quel caractère d'espacement (espace, tabulation, saut de ligne)
- Ne capture que des mots simples - "Hello World" devient simplement "Hello"
- Pas de protection contre le dépassement de tampon - assurez-vous que votre tableau est assez grand
- N'utilisez pas l'opérateur
&avec les noms de tableaux (ce sont déjà des adresses)
Essayez vous-même
#include <stdio.h>
int main() {
// À FAIRE : Déclarez vos tableaux de caractères ici
// À FAIRE : Écrivez votre code ici pour demander et lire l'entrée
// À FAIRE : Affichez le message de sortie final
return 0;
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logic & Flow
1Les bases des pointeurs
Qu'est-ce qu'un pointeur ?Déclaration de pointeursL'opérateur d'adresse (&)L'opérateur de déréférencement (*)Pointeurs NULLRécapitulatif : Les bases des pointeurs4Projet : Utilitaire de texte simple
Présentation du projetCompter les caractères2Pointeurs et Tableaux
Noms de tableaux comme pointeursÉléments de tableau - PointeursArithmétique des pointeursComparaison de pointeursRécapitulatif : Parcours de tableau par pointeur5Pointeurs et fonctions
Passage par valeurPassage de pointeurs aux fonctionsModifier des variables via des pointeursUn exemple classique : SwapPassage de tableaux aux fonctionsRécapitulatif : Pointeurs comme arguments de fonction3Tableaux de caractères et chaînes
Les chaînes comme tableaux de charLe terminateur nulSaisie de chaînes avec scanfUtilisation de strlen()Utilisation de strcpy()Utilisation de strcat()Utilisation de strcmp()Récapitulatif : Fonctions de base sur les chaînes