Langage C: Initiale du 1er mot ?

Résolu/Fermé
Le GeekdesGeeks Messages postés 288 Date d'inscription lundi 9 août 2010 Statut Membre Dernière intervention 13 mars 2011 - Modifié par Le GeekdesGeeks le 29/01/2011 à 09:59
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 - 29 janv. 2011 à 14:20
Bonjour,

voilà un problème de programmation en langage C ou je bute:

"Ecrire un programme qui lit une ligne tapée au clavier et affiche en majuscules les initiales des mots qu'elle contient. Le texte contient uniquement des lettres minuscules non accentuées et des espaces. Les mots sont séparés par des espaces (un espace entre deux mots successifs). Il n'y a pas d'espace avant le premier mot, qui commence au premier caractère. "

Par exemple si on tape :
abc def ghi
le programme doit renvoyer
ADG
le programme que j'ai écrit lui renvoie :DG
impossible de trouver comment lui faire mettre la majuscule pour le 1 er mot (car il n'a pas d'espace devant lui ) même en initialisant les 2 variables à un espace ' '.

#include <stdio.h>
int main()
{
char lettreLu = ' ' ;
char lettreTampon= ' ';
//On met la boucle en route
while (lettreLu != '\n')
{
scanf("%c",&lettreLu);
// on stocke la valeur lue dans la variable lettreTampon
lettreTampon= lettreLu;
if ( lettreTampon == ' ')
// le programme lit la lettre suivante
{
scanf("%c",&lettreLu);
// mise en majuscule si c'est une lettre en minuscule
if (lettreLu >= 'a' && lettreLu <= 'z')
printf("%c",lettreLu-32);
else
printf("%c",lettreLu);
}
}
printf( "\n");
return 0;
}

Merci pour vos suggestions

A voir également:

3 réponses

Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
Modifié par Hxyp le 29/01/2011 à 11:25
Bonjour,
J'ai utilisé un int qui se met à 1 lorsqu'il rencontre une lettre et se remet à 0 lorsqu'il rencontre un espace comme ça il peut prendre la première lettre tout en récupérant celles qui se trouvent juste après un espace :

int main() 
{ 
    char lettreLu=' '; 
    int tmp=0; 
    while (lettreLu != '\n') 
    { 
        lettreLu=getchar(); 
        if(lettreLu!=' ') 
        { 
            if(!tmp) 
            { 
                if (lettreLu >= 'a' && lettreLu <= 'z') 
                putchar(lettreLu-32); 
                else 
                putchar(lettreLu); 
                tmp=1; 
            } 
        } 
        else { tmp=0; } 
    } 
    printf( "\n"); 
return 0; 
} 


Ce serait plus simple en utilisant une chaine de caractère vous pourriez alors la parcourir de long en large après la saisie complétée.
0
Le GeekdesGeeks Messages postés 288 Date d'inscription lundi 9 août 2010 Statut Membre Dernière intervention 13 mars 2011 49
29 janv. 2011 à 12:30
Un grand merci Hxyp, le programme fonctionne à merveille !
Je n'ai pas utilisé de chaîne de caractère car je débute en C et ce n'était pas dans la logique de l'apprentissage, celà va venir plus tard .
0
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
29 janv. 2011 à 14:20
De rien ça m'a permis de me mettre mon cerveau à jour. Pour tout dire je n'avais jamais utiliser la console pour récupérer une chaine alors j'ai un peu galérer depuis tout à l'heure entre le getchar qui bloque le gets qui n'est pas conforme et le scanf("%s"...) enfin tout d'même réussi à pondre une fonction pour récupérer la chaine taper sans se casser la tête à chaque fois! je vous la partage (au cas où!) :

size_t get_chaine(char *tab,int taille)
{
    unsigned int i=0;
    while(i<taille-1)
    {
        scanf("%c",&tab[i]);
        if(tab[i]=='\n'){break;}
        i++;
    }
    tab[i]=0;
    return i;
}


elle retourne la taille de la chaine entrée en console; en paramètre elle prend un tableau de char et sa taille_max pour ne pas dépasser la mémoire allouée et ajoute un caractère null (\0) à la fin de la chaine c'est donc taille_max-1 du tableau qui est utilisable. Et fin si on a un saut de ligne \n.

exemple d'utilisation :

int main()
{
    char buff[80];
    int a;
    a=get_chaine(buff,80);
    printf("chaine : %s\ntaille : %d\n",buff,a);
    return 0;
}
0