user
Peux-tu corriger ce programme : void majuscule(char s[]); int main (void){ char st[100]; printf("entrez une chaine de caractere a mettre en majuscule : "); scanf("%s", st); majuscule(st); return 0; } void majuscule (char s[]){ int i = 0; do{ if (s[i]==' '){ printf(" "); } s[i] = s[i]-32; printf("%c", s[i]); i++; } while (s[i]!='\0'); }
alphonsio

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 :

  1. Problème avec l'entrée de la chaîne :

    • L'utilisation de 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.
  2. Conversion de toutes les lettres

    • Le programme convertit toutes les lettres, même les caractères qui ne sont pas des lettres minuscules. Il faut s'assurer que c'est une lettre minuscule avant de convertir en majuscule.
  3. Le printf("%c", s[i]); dans la fonction

    • Le 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.
  4. Améliorations stylistiques :

    • Une boucle while est suffisante pour parcourir la chaîne.
    • Ajoutez un retour à la ligne après l'affichage final.

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++;
    }
}

Explications des changements :

  1. Lecture avec fgets :

    • Permet de lire une ligne entière, y compris les espaces. Elle ajoute un \n à la fin de la chaîne.
  2. Conversion des lettre minuscules uniquement

    • Le if (s[i]>='a' && s[i]<='z') permet de s'assurer que la lettre est minuscule avant de la convertir.
  3. printf dans le programme principal

    • L'affichage du résultat est maintenant fait dans le programme principal.

Ce programme est plus robuste et fonctionne correctement pour convertir une chaîne complète en majuscules.