01net    Web


Actuellement en ligne : 1058 Utilisateurs dont 39 dans Programmation et développement >S'inscrire      >S'identifier      >Recherche      >Aide  
modéré par A.Ouloube, Beno@  
01net > Forum de 01net > Programmation et développement > C/C++
> [C] /!\ chaîne de caractère
Passionné(e) d'internet, de logiciels, de forums ? 01net recrute...
Auteur
Message
 
<     1       >
merlin54
  
   
      ?   @     Posté le 08/11/2006 22:38:54  
Voter pour ce message
Bonjour à tous, je commence un peu à toucher le C et me voila confronter à un petit problème.

Je dois , dans le mot "bonjour" comptabiliser le nombre de b, le nombre de o, le nombre de j etc... et ensuite affichier les nons-nuls.

Pour cela j'ai eu l'idée d'utiliser une boucle for mais j'ai quelques soucis.
Je c'est qu'il faut d'abord :
- tapper le mot "bonjour"
- puis initialiser lettre[26]=0
- puis la fameuse boucle for de 0 à lg(phrase)-1
- puis éxecuter l'action lettre[phrase-'a']+1
- et pour finir afficher lettre[26] des non nuls.

Voici mon code C :

#include <stdio.h>
#include <string.h>

void main()

{
int phrase,i,x;
char lettre[26]={"bonjour"};

gets (lettre);
x=strlen(lettre);

printf("%i ",phrase);

lettre[26]=0;

for ( i=0; i<25; i++);

x=lettre[phrase-'a']+1;

printf("%i ",lettre[26]);


}


Comme vous le voyez, j'ai du mal et je serai très reconnaissant pour l'aide de l'un d'entre vous.

Merci d'avance!
Minus-et-Cortex
  
   
      ?   @     Posté le 09/11/2006 00:50:36  
Voter pour ce message
#include <stdio.h>
#include <string.h>

void main()

{
int phrase,i,x;
char lettre[26]={"bonjour"};

Tu déclares un tableau de 26 caractères que tu initialises avec les caractères 'b', 'o', 'n', 'j', 'o', 'u', 'r'. Est-ce nécessaire puisque juste après, tu lis depuis l'entrée standard une chaîne de caractères dans ce tableau (ce qui écrase ta valeur initiale).
gets (lettre);

Attention à l'utilisation de cette fonction : tu stockes des caractères dans le tableau lettre tant que tu n'appuies pas sur la touche 'Entrée'. Si tu tapes 30 caractères, la fonction va écraser ce qui se trouve après les 26 premiers emplacements réservés pour le tableau lettre. Cela peut mettre en rade tout ton PC (qu'il faudra redémarrer probablement). Supposons alors que tu ne saisissent que des chaînes de moins de 26 caractères (jette un oeil sur http://unixhelp.ed.ac.uk/CGI/man-cgi?gets ).
x=strlen(lettre);

printf("%i ",phrase);

Pourquoi afficher phrase qui n'a pas été modifié (ni même initialisé) ?
lettre[26]=0;

Cette instruction pose problème puisque ton tableau lettre contient 26 éléments indicés de 0 à 25. Donc ici tu écris la valeur 0 en dehors du tableau, donc tu es susceptible d'écraser une information qui ne t'appartient pas.
for ( i=0; i<25; i++);

Là par contre, tu fais un tour en moins, tu vas de 0 à 24 inclus. Il faudrait écrire i<26 pour aller de 0 à 25.
x=lettre[phrase[ i]-'a']+1;

Problème avec phrase : tu le définis comme un entier, mais tu t'en sert comme d'un tableau, cela ne va pas fonctionner.
printf("%i ",lettre[26]);

Tu ne fais qu'afficher un élément qui se trouve en dehors de ton tableau.
}

Je te propose ceci :

#include <stdio.h>
#include <string.h>

void main() {
int cpt, lettres[26]; // lettres va te servir à compter les lettres du mot
char phrase[26]; // te sert à récupérer les mots avec gets

lire une chaîne dans phrase depuis l'entrée standard
initialiser chaque élément du tableau lettres avec la valeur 0 - avec une boucle for
for (cpt = 0 ; cpt < strlen(phrase) ; cpt++) {
ajouter 1 dans le tableau lettres correspondant à la lettre 'phrase[cpt]'
}
for (cpt = 0 ; cpt < 26 ; cpt++) {
si lettres[cpt] est non nul, alors afficher ("%c : %i", (char)cpt, lettres[cpt]) - affiche le caractère et le nombre d'occurences
}

@+
-->Message édité par Minus-et-Cortex le 09/11/2006 00:52:35<--
-------
Mieux vaut fermer sa gueule et passer pour un con que l'ouvrir et ne laisser aucun doute à ce sujet.
Gustave Parking
merlin54
  
   
      ?   @     Posté le 09/11/2006 20:03:20  
Voter pour ce message
Tout dabord merci pour ton message cela m'a bien aidé mais j'ai toujours un warning avec ce code et lorsque je build je peut entrer mon mot mais quand je tappe "entrée" rien ne vient. :/

#include <stdio.h>
#include <string.h>

void main()

{

int i, lettre[26],x;
char phrase[26];


gets (phrase);
x=strlen(phrase);

for (i = 0 ; i < 26 ; i++)

{
lettre[26]=0;
}

//initialiser chaque élément du tableau lettres avec la valeur 0
for (i = 0 ; i < strlen(phrase) ; i++)

{
lettre[phrase - 'a']++;
}

for (i = 0 ; i < 26 ; i++)

{

if lettre !=0; printf("%c , %i", (char) i, lettre);
}
}

-->Message édité par merlin54 le 09/11/2006 20:13:13<--
Minus-et-Cortex
  
   
      ?   @     Posté le 09/11/2006 20:41:25  
Voter pour ce message
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
int cpt, lettre[26],x;
char phrase[26];

gets (phrase);
x=strlen(phrase);

for (cpt = 0 ; cpt < 26 ; cpt++) {
lettre[cpt]=0;
}

//initialiser chaque élément du tableau lettres avec la valeur 0
for (cpt = 0 ; cpt < strlen(phrase) ; cpt++) {
lettre[phrase[cpt] - 'a']++;
}

for (cpt = 0 ; cpt < 26 ; cpt++) {
if (lettre[cpt] != 0) printf("%c , %i\n", (char) (cpt + 'a'), lettre[cpt]);
}
printf("\n");
system("PAUSE");
}


@+
-->Message édité par Minus-et-Cortex le 09/11/2006 20:42:18<--
-------
Mieux vaut fermer sa gueule et passer pour un con que l'ouvrir et ne laisser aucun doute à ce sujet.
Gustave Parking
<     1       >

01net > Forum de 01net > Programmation et développement > C/C++
> [C] /!\ chaîne de caractère

Aller à :

Page générée en : 0.13s - X2board 2.2

Nous contacter | Charte de confiance | Voir notice légale

Tous droits réservés © 1999 - 2008 Groupe Tests - 01net.


Sites du réseau 01net Network : 01net - 01men - Rmc.fr - Bfmtv.fr - Radiobfm.com - TousLesPodcasts - Micro Achat

Emploi 
Rémunérations :
30 fiches salaires des métiers informatiques passées au crible  !
Jeux
Nouveauté : Partez à la recherche de trésors antiques inestimables dans Mahjongg Roadshow !