Voici la version améliorée et fonctionnelle de la fonction :
void majuscule(char s[]) {
int i = 0;
// Parcourt la chaîne jusqu'au caractère nul
while (s[i] != '\0') {
// Si c'est une lettre minuscule [a..z], convertit en majuscule
if (s[i]>='a' && s[i]<='z') s[i] -= 32;
i++;
}
}
Votre programme contient quelques erreurs et peut être amélioré. Voici les points principaux à corriger et améliorer :
Problème avec l'entrée de la chaîne :
scanf("%s", st)
pose problème si la chaîne contient des espaces, car scanf
s'arrête au premier espace. Pour lire une ligne entière, utilisez fgets
.Conversion de toutes les lettres
Le printf("%c", s[i]);
dans la fonction
printf("%c", s[i]);
est mal placé dans la fonction. Il faut éviter les affichages dans les fonctions. Il convient de le déplacer dans la fonction principale.Améliorations stylistiques :
while
est suffisante pour parcourir la chaîne.Voici la version corrigée :
#include <stdio.h>
#include <ctype.h> // Pour la fonction toupper
void majuscule(char s[]);
int main(void) {
char st[100];
printf("Entrez une chaîne de caractères à mettre en majuscule : ");
fgets(st, sizeof(st), stdin); // Lire toute la ligne, y compris les espaces
majuscule(st);
printf ("%s\n", st);
return 0;
}
void majuscule(char s[]) {
int i = 0;
while (s[i] != '\0') { // Parcourt la chaîne jusqu'au caractère nul
if (s[i]>='a' && s[i]<='z') { // Si c'est une lettre minuscule [a..z]
s[i] -= 32; // Convertit en majuscule
}
i++;
}
}
Lecture avec fgets
:
\n
à la fin de la chaîne.Conversion des lettre minuscules uniquement
if (s[i]>='a' && s[i]<='z')
permet de s'assurer que la lettre est minuscule avant de la convertir.printf
dans le programme principal
Ce programme est plus robuste et fonctionne correctement pour convertir une chaîne complète en majuscules.