New
Écrivez un programme qui lit au clavier un prénom, un nom, et un âge puis affiche le message “Bonjour PRÉNOM NOM, vous avez ÂGE ans.” où les mots en majuscules sont remplacés par les valeurs lues au clavier.
Feb 11, 3:49pm

Voici un exemple de programme en Python qui lit un prénom, un nom et un âge au clavier, puis affiche le message demandé :

python
# Demander à l'utilisateur de saisir son prénom prenom = input("Entrez votre prénom : ") # Demander à l'utilisateur de saisir son nom nom = input("Entrez votre nom : ") # Demander à l'utilisateur de saisir son âge age = input("Entrez votre âge : ") # Afficher le message avec les valeurs saisies print(f"Bonjour {prenom} {nom}, vous avez {age} ans.")

Vous pouvez exécuter ce programme dans un environnement Python. Il demandera à l'utilisateur de saisir son prénom, son nom et son âge, puis affichera le message formaté avec les valeurs saisies.

Feb 11, 3:49pm
En C plutôt qu'en Python.
Feb 11, 3:50pm

Voici un exemple de programme en C qui lit un prénom, un nom et un âge au clavier, puis affiche le message demandé :

c
#include <stdio.h> int main() { // Déclaration des variables pour stocker le prénom, le nom et l'âge char prenom[50]; char nom[50]; int age; // Demander à l'utilisateur de saisir son prénom printf("Entrez votre prénom : "); scanf("%s", prenom); // Demander à l'utilisateur de saisir son nom printf("Entrez votre nom : "); scanf("%s", nom); // Demander à l'utilisateur de saisir son âge printf("Entrez votre âge : "); scanf("%d", &age); // Afficher le message avec les valeurs saisies printf("Bonjour %s %s, vous avez %d ans.\n", prenom, nom, age); return 0; }

Vous pouvez compiler et exécuter ce programme dans un environnement C. Il demandera à l'utilisateur de saisir son prénom, son nom et son âge, puis affichera le message formaté avec les valeurs saisies.

Feb 11, 3:50pm
Que se passe-t-il si un utilisateur de ce programme tape un prénom de plus de 50 caractères ?
Feb 11, 3:52pm

Si un utilisateur tape un prénom ou un nom de plus de 50 caractères, le programme en C tel qu'il est écrit ci-dessus peut rencontrer des problèmes de dépassement de tampon (buffer overflow). Cela peut entraîner un comportement imprévisible, y compris des plantages du programme ou des vulnérabilités de sécurité.

Pour éviter ce problème, vous pouvez limiter la taille des entrées en utilisant une fonction comme fgets au lieu de scanf, qui permet de spécifier la taille maximale de l'entrée. Voici comment vous pouvez modifier le programme pour gérer ce cas :

c
#include <stdio.h> int main() { // Déclaration des variables pour stocker le prénom, le nom et l'âge char prenom[50]; char nom[50]; int age; // Demander à l'utilisateur de saisir son prénom printf("Entrez votre prénom : "); fgets(prenom, sizeof(prenom), stdin); // Supprimer le caractère de nouvelle ligne si présent prenom[strcspn(prenom, "\n")] = 0; // Demander à l'utilisateur de saisir son nom printf("Entrez votre nom : "); fgets(nom, sizeof(nom), stdin); // Supprimer le caractère de nouvelle ligne si présent nom[strcspn(nom, "\n")] = 0; // Demander à l'utilisateur de saisir son âge printf("Entrez votre âge : "); scanf("%d", &age); // Afficher le message avec les valeurs saisies printf("Bonjour %s %s, vous avez %d ans.\n", prenom, nom, age); return 0; }

Dans ce code, fgets est utilisé pour lire les chaînes de caractères, ce qui permet de limiter la taille de l'entrée à 50 caractères (y compris le caractère de fin de chaîne \0). La fonction strcspn est utilisée pour supprimer le caractère de nouvelle ligne (\n) qui peut être inclus dans l'entrée lorsque l'utilisateur appuie sur Entrée.

Feb 11, 3:52pm
Peut-on trouver une solution sans débordement de tampon et en utilisant scanf à condition d'utiliser le compilateur GCC ?
Feb 11, 3:53pm

Oui, il est possible d'utiliser scanf de manière sécurisée pour éviter les débordements de tampon en spécifiant une largeur maximale pour les chaînes de caractères. Cependant, il est important de noter que cette méthode fonctionne avec les compilateurs conformes au standard C99 et ultérieurs, y compris GCC.

Voici comment vous pouvez modifier le programme pour utiliser scanf de manière sécurisée :

c
#include <stdio.h> int main() { // Déclaration des variables pour stocker le prénom, le nom et l'âge char prenom[50]; char nom[50]; int age; // Demander à l'utilisateur de saisir son prénom printf("Entrez votre prénom : "); scanf("%49s", prenom); // Limiter la taille de l'entrée à 49 caractères + 1 pour le caractère de fin de chaîne // Demander à l'utilisateur de saisir son nom printf("Entrez votre nom : "); scanf("%49s", nom); // Limiter la taille de l'entrée à 49 caractères + 1 pour le caractère de fin de chaîne // Demander à l'utilisateur de saisir son âge printf("Entrez votre âge : "); scanf("%d", &age); // Afficher le message avec les valeurs saisies printf("Bonjour %s %s, vous avez %d ans.\n", prenom, nom, age); return 0; }

Dans ce code, scanf("%49s", prenom) et scanf("%49s", nom) limitent la taille des entrées à 49 caractères, plus un caractère pour le caractère de fin de chaîne (\0). Cela empêche les débordements de tampon en garantissant que les chaînes de caractères ne dépassent pas la taille des tableaux prenom et nom.

Cette méthode est sûre et fonctionne avec le compilateur GCC, ainsi qu'avec d'autres compilateurs conformes au standard C99 et ultérieurs.

Feb 11, 3:53pm
Et avec "%ms" ?
Feb 11, 3:54pm

L'utilisation de "%ms" avec scanf est une extension spécifique à GCC qui permet d'allouer dynamiquement de la mémoire pour les chaînes de caractères lues. Cela peut être utile pour éviter les débordements de tampon, car scanf allouera automatiquement la mémoire nécessaire pour stocker la chaîne de caractères lue.

Voici comment vous pouvez utiliser "%ms" pour lire des chaînes de caractères de manière sécurisée :

c
#include <stdio.h> #include <stdlib.h> int main() { // Déclaration des variables pour stocker le prénom, le nom et l'âge char *prenom = NULL; char *nom = NULL; int age; // Demander à l'utilisateur de saisir son prénom printf("Entrez votre prénom : "); scanf("%ms", &prenom); // Utiliser %ms pour allouer dynamiquement de la mémoire // Demander à l'utilisateur de saisir son nom printf("Entrez votre nom : "); scanf("%ms", &nom); // Utiliser %ms pour allouer dynamiquement de la mémoire // Demander à l'utilisateur de saisir son âge printf("Entrez votre âge : "); scanf("%d", &age); // Afficher le message avec les valeurs saisies printf("Bonjour %s %s, vous avez %d ans.\n", prenom, nom, age); // Libérer la mémoire allouée dynamiquement free(prenom); free(nom); return 0; }

Dans ce code, scanf("%ms", &prenom) et scanf("%ms", &nom) utilisent l'extension "%ms" pour allouer dynamiquement de la mémoire pour les chaînes de caractères prenom et nom. Cela garantit que les chaînes de caractères lues ne dépasseront pas la mémoire allouée, évitant ainsi les débordements de tampon.

Il est important de libérer la mémoire allouée dynamiquement avec free(prenom) et free(nom) à la fin du programme pour éviter les fuites de mémoire.

Cette méthode est spécifique à GCC et peut ne pas être portable vers d'autres compilateurs qui ne supportent pas cette extension.

Feb 11, 3:54pm
Est-ce qu'un âge peut être négatif ?
Feb 11, 3:54pm

En général, un âge ne peut pas être négatif dans le contexte des êtres humains, car l'âge représente le nombre d'années écoulées depuis la naissance d'une personne. Par conséquent, un âge négatif n'aurait pas de sens logique.

Cependant, dans un programme informatique, il est possible qu'un utilisateur entre un âge négatif par erreur ou par malveillance. Pour gérer ce cas, vous pouvez ajouter une vérification dans votre programme pour vous assurer que l'âge saisi est valide (c'est-à-dire non négatif).

Voici comment vous pouvez modifier le programme pour inclure cette vérification :

c
#include <stdio.h> #include <stdlib.h> int main() { // Déclaration des variables pour stocker le prénom, le nom et l'âge char *prenom = NULL; char *nom = NULL; int age; // Demander à l'utilisateur de saisir son prénom printf("Entrez votre prénom : "); scanf("%ms", &prenom); // Utiliser %ms pour allouer dynamiquement de la mémoire // Demander à l'utilisateur de saisir son nom printf("Entrez votre nom : "); scanf("%ms", &nom); // Utiliser %ms pour allouer dynamiquement de la mémoire // Demander à l'utilisateur de saisir son âge printf("Entrez votre âge : "); scanf("%d", &age); // Vérifier si l'âge est valide if (age < 0) { printf("L'âge ne peut pas être négatif.\n"); // Libérer la mémoire allouée dynamiquement free(prenom); free(nom); return 1; // Quitter le programme avec un code d'erreur } // Afficher le message avec les valeurs saisies printf("Bonjour %s %s, vous avez %d ans.\n", prenom, nom, age); // Libérer la mémoire allouée dynamiquement free(prenom); free(nom); return 0; }

Dans ce code, une vérification est ajoutée après la saisie de l'âge pour s'assurer qu'il n'est pas négatif. Si l'âge est négatif, le programme affiche un message d'erreur, libère la mémoire allouée dynamiquement et quitte avec un code d'erreur.

Feb 11, 3:54pm
Plutôt que tester si l'âge est négatif, est-ce qu'on peut le déclarer et le lire autrement ?
Feb 11, 3:55pm

Oui, vous pouvez déclarer l'âge comme un type unsigned int (entier non signé) pour garantir qu'il ne peut pas être négatif. En C, un unsigned int ne peut contenir que des valeurs positives ou zéro. Cela permet de s'assurer que l'âge saisi ne sera jamais négatif.

Voici comment vous pouvez modifier le programme pour utiliser unsigned int pour l'âge :

c
#include <stdio.h> #include <stdlib.h> int main() { // Déclaration des variables pour stocker le prénom, le nom et l'âge char *prenom = NULL; char *nom = NULL; unsigned int age; // Utiliser unsigned int pour garantir que l'âge ne peut pas être négatif // Demander à l'utilisateur de saisir son prénom printf("Entrez votre prénom : "); scanf("%ms", &prenom); // Utiliser %ms pour allouer dynamiquement de la mémoire // Demander à l'utilisateur de saisir son nom printf("Entrez votre nom : "); scanf("%ms", &nom); // Utiliser %ms pour allouer dynamiquement de la mémoire // Demander à l'utilisateur de saisir son âge printf("Entrez votre âge : "); scanf("%u", &age); // Utiliser %u pour lire un unsigned int // Afficher le message avec les valeurs saisies printf("Bonjour %s %s, vous avez %u ans.\n", prenom, nom, age); // Libérer la mémoire allouée dynamiquement free(prenom); free(nom); return 0; }

Dans ce code, unsigned int age garantit que l'âge ne peut pas être négatif. Lors de la lecture de l'âge avec scanf, le format %u est utilisé pour lire un entier non signé. Cela empêche l'utilisateur de saisir un âge négatif, car scanf interprétera toute entrée négative comme une valeur positive ou zéro.

Feb 11, 3:55pm

This Chat is read-only. Login to resume chatting.

Sign in