Erreur d'affichage et de comparaison entre string et un tableau de caractère

Fermé
anflori - 28 févr. 2020 à 15:46
 anflori - 9 avril 2020 à 17:14
Bonjour,

Je développe actuellement le jeu du pendu en C++ dans le cadre de ma spécialité ISN. Tout est dans le titre, ce n'est valable que pour des mots de 5 lettres, mon programme marche pour les autres mots.

A l'affichage j'ai un "@" en plus à la fin de l'affichage du mot masqué, uniquement pour les mots à trouver de 5 lettres, de plus lors de la comparaison, il ne trouve jamais bonmot!=motencours
-> false lorsque c'est un mot de 5 lettres, ce qui n'est pas le cas avec un mot d'une longueur!=5 .

voici mon programme :

--------------------------------------------------------------------------------------------------------------------
#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
int niveau,listmot = 0;
char theme;
int nbcaracter;
int x = 0;
bool dfaute ;
int main()
{

using namespace std;
string Voiture[5][5][2]=
{
{"c a r r o s s e r i e ","11","r o u e ","4","p e r m i s ","6","c o u r s e ","6","j a n t e ","5"},
{"b e r l i n e ","7","c o m p a c t ","7","s i e g e ","5","e c h a p p e m e n t ","11","m o t e u r ","6"},
{"e m b r a y a g e","9","p o r t e ","5","c o f f r e ","6","r e t r o v i s e u r ","11","d r i f t ","5"},
{"m a r q u e","6","c a p o t ","5","p l a q u e ","6","i m m a t r i c u l a t i o n ","15","d r a g s t e r ","8"},
{"f r e i n ","5","r a l l y e ","6","r a d i o ","5","v i t e s s e ","7","a u t o m a t i q u e ","11"}
};

cout << "Bienvenue au jeu du pendu!\nSelectionner un thème parmis:\nVoiture\nSport\nMarque\n";
cin >> theme ;
cout << "Selectionner un niveau :\n1 \n2 \n3 \n4 \n5 \n";
cin >> niveau ;
if(theme=='v')
{
srand(time(0));
niveau = niveau-1 ;
listmot = (rand() % 5);
cout <<"Vous devez trouver un mot de " << Voiture[niveau][listmot][1] <<" lettres!\nVous avez le droit de faire 6 fautes pas une de plus !\nC'est parti!\n";
nbcaracter = stoi(Voiture[niveau][listmot][1]);
string bonmot = Voiture[niveau][listmot][0];
char motencours[nbcaracter];
for(int w = 0;w<nbcaracter*2;w++)
{
if(w & 1)// n est impair
{
motencours[w] = ' ';
}
else// n est pair
{
motencours[w] = '_';
}

}
cout << motencours;
int faute = 0 ;
while( faute < 6 && motencours != bonmot )
{
cout << "\nEntrer une lettre!";
char lettre ;
cin >> lettre ;
dfaute = true;
for (int i = 0;i<nbcaracter*2;i++)
{
if(bonmot[i]==lettre)
{
motencours[i] = {lettre};

dfaute = false;
}
};
if(dfaute==true)
{
faute++;
};
cout << motencours;
};
if (faute<6)
{
cout << "\nBravo! Vous avez trouvé le mot " << bonmot <<" en " << faute << " faute(s)";
}
else
{
cout << "\nDommage! Vous avez perdu vous allez être pendu !\nLe mot était " << bonmot <<".";
}


};
}
-----------------------------------------------------------------------------------------------------------------------------------------------------

J'obtiens :

---------------------------------------
clang version 7.0.0-3~ubuntu0.18.04.1 (tags/RELEASE_700/final)
 clang++-7 -pthread -o main main.cpp
 ./main
vBienvenue au jeu du pendu!
Selectionner un thème parmis:
Voiture
Sport
Marque
3
Selectionner un niveau :
1
2
3
4
5
Vous devez trouver un mot de 5 lettres!
Vous avez le droit de faire 6 fautes pas une de plus !
C'est parti!
_ _ _ _ _ @
Entrer une lettre!d
d _ _ _ _ @
Entrer une lettre!r
d r _ _ _ @
Entrer une lettre!i
d r i _ _ @
Entrer une lettre!f
d r i f _ @
Entrer une lettre!t
d r i f t @
Entrer une lettre!
-----------------------------------------------------------------------------------

Merci d'avance pour votre aide !

Configuration: Windows / Chrome 80.0.3987.122
A voir également:

2 réponses

quent217 Messages postés 421 Date d'inscription vendredi 25 septembre 2015 Statut Membre Dernière intervention 1 mars 2024 344
28 févr. 2020 à 20:49
Bonjour,
Dans vos prochains messages, merci d'utiliser les balises de code https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code.

Premièrement, une chaine de caractère doit se terminer par la charactère \0, c'est comme ça que le cout sait quand il doit arrêter d'afficher les caractères, sinon il déborde de la mémoire et vous voyez des caractères étonnant. C'est gérer automatiquement par le type string mais comme vous utilisez un tableau de char pour la variable motencours, ça pose problème.

Deuxièmement, vous initialisez motencours avec nbcaracter mais la boucle pour remplir le tableau va jusqu'à nbcaracter*2 donc vous remplissez des caractères en dehors du tableau.
1
Marci beaucoup quent217 , j'ai réussi a terminé mon code en C++.
Dans le but d'intégrer un afficheur 7 segments je dois reprogrammé le code en langage "arduino".j'ai donc fait ceci :
#include <SoftwareSerial.h>
#include <string.h>
using namespace std ;
int niveau= 9;
long listmot;
String theme ;
String bonmot ;
unsigned int nbcaracter;
int x = 0;
bool dfaute ;
bool v = false ;
void dvoiture()
{ 
  using namespace std ;
  String Voiture[5][5][2]=
  {
    {"c a r r o s s e r i e ","11","r o u e ","4","p e r m i s ","6","c o u r s e ","6","j a n t e ","5"},
    {"b e r l i n e ","7","c o m p a c t ","7","s i e g e ","5","e c h a p p e m e n t ","11","m o t e u r ","6"},
    {"e m b r a y a g e","9","p o r t e ","5","c o f f r e ","6","r e t r o v i s e u r ","11","d r i f t ","5"},
    {"m a r q u e","6","c a p o t ","5","p l a q u e ","6","i m m a t r i c u l a t i o n ","15","d r a g s t e r ","8"},
    {"f r e i n ","5","r a l l y e ","6","r a d i o ","5","v i t e s s e ","7","a u t o m a t i q u e ","11"}
  };
  Serial.println("Vous devez trouver un mot de ");
  Serial.print(Voiture[niveau][listmot][1]);
  Serial.print(" lettres   !");
  Serial.println("Vous avez le droit de faire 6 fautes pas une de plus !");
  Serial.println(" C'est parti! ");
  nbcaracter = Voiture[niveau][listmot][1].length();
  bonmot = Voiture[niveau][listmot][0];
}
void dmarque()
{
  using namespace std ;
  String Marque[5][5][2]=
  {
    {"s o n y ","4","i n t e l ","5","a p p l e ","5","n o k i a ","5","s a m s u n g ","7"},
    {"m i c r o s o f t ","9","a n d r o i d ","7","l i n u x ","5","n i n t e n d o ","8","b o s e ","4"},
    {"l e n o v o ","6","d e l l ","4","h o n o r ","5","x i a o m i ","6","c o r s a i r ","7"},
    {"m a r s h a l l ","8","k i n g s t o n ","8","t o s h i b a ","7","c i s c o ","5","i b m ","3"},
    {"l o g i t e c h ","8","u b i s o f t ","7","w i k o ","4","p h i l l i p s ","8","n v i d i a ","6"}
  };
  Serial.println("Vous devez trouver un mot de ");
  Serial.print(Marque[niveau][listmot][1]);
  Serial.print(" lettres   !");
  Serial.println("Vous avez le droit de faire 6 fautes pas une de plus !");
  Serial.println(" C'est parti! ");
  nbcaracter = Marque[niveau][listmot][1].length();
  bonmot = Marque[niveau][listmot][0];
}
void dsport()
{ 
  using namespace std ;
  String Sport[5][5][2]=
  {
    {"f o o t b a l l ","8","v o l l e y ","6","j u d o ","4","b a s k e t b a l l ","10","h a n d b a l l ","8"},
    {"b a s e b a l l ","8","c y c l i s m e ","8","n a t a t i o n ","8","s n o w b o a r d ","9","s k i ","3"},
    {"p a t i n a g e ","8","b i a t h l o n ","8","r o l l e r  ","6","z u m b a ","5","v o i l e ","5"},
    {"y o g a ","4","v t t ","3","p o l o ","4","f u t s a l ","6","t a e k w o n d o ","9"},
    {"b o b s l e i g h ","9","p a r a c h u t i s m e ","12","u l t i m a t e ","8","r a f t i n g ","7","k a y a k ","5"}
  };
  Serial.println("Vous devez trouver un mot de ");
  Serial.print(Sport[niveau][listmot][1]);
  Serial.print(" lettres   !");
  Serial.println("Vous avez le droit de faire 6 fautes pas une de plus !");
  Serial.println(" C'est parti! ");
  nbcaracter = Sport[niveau][listmot][1].length();
  bonmot = Sport[niveau][listmot][0];
}
void setup()
{
  Serial.begin(9600);
  randomSeed(analogRead(0));
}
void loop()
{ 
  using namespace std;
  Serial.println("Bienvenue au jeu du pendu!");
  Serial.println("Selectionner un thème parmis:");
  Serial.println("Voiture");
  Serial.println("Sport");
  Serial.println("Marque");
  int p = 0;
  while(theme != "Sport" && theme!= "Marque" && theme!= "Voiture")
  { 
    if(Serial.available()>0)
    {
      do
      {
        char c = Serial.read();
        if(c != -1)
        {
          theme +=c;
        }
        delay(50);
        p++;
      }while(p<11);
      if(p>10)
      {
        theme += '\0' ;
      }
    }
  }
  Serial.println("Selectionner un niveau :");
  Serial.println("1"); 
  Serial.println("2"); 
  Serial.println("3"); 
  Serial.println("4"); 
  Serial.println("5"); 
  Serial.println();
  int c = 10;
  do
  { 
    if(Serial.available()>0)
    {
      int c = Serial.read();
      if(c != -1)
      {
        delay(50);
        niveau = c ;
        Serial.println(niveau);
      }
    }
  }while((niveau != 49) && (niveau != 50) && (niveau != 51) && (niveau != 52) && (niveau != 53));
  
  Serial.println("Good");
  niveau = niveau-48 ;   
  listmot = random(5);
  if (theme == "Voiture" )
  {
    dvoiture();
  }
  if (theme == "Marque")
  {
    dmarque();
  }
  if (theme == "Sport")
  {
    dsport();
  }
  
  char motencours[nbcaracter];
  for(int w = 0;w<nbcaracter*2;w++)
  {
    if(w & 1)// n est impair
    {
      motencours[w] = ' ';
    }
    else// n est pair
    {
      motencours[w] = '_';
    }
    
  }
  unsigned int nbcaracter1 = nbcaracter*2;
  motencours [nbcaracter1] = '\0' ;
  Serial.print(motencours);
  int faute = 0 ;
  char bonmot1[] = {'a'} ;
  bonmot.toCharArray(bonmot1 , nbcaracter1);
  while( faute < 6  &&  motencours != bonmot1 )
  {
    Serial.println("\nEntrer une lettre!");
    char lettre ;
    do
    {
      int lettre = Serial.read();
    }while(lettre == -1 );
    dfaute = true;
    for (int i = 0;i<nbcaracter*2;i++)
    { 
      if(bonmot[i]==lettre)
      {
        motencours[i] = {lettre};
        dfaute = false;                 
      }
    }
    if(dfaute==true)
    {
      faute++;
    };
    Serial.print(motencours);
  }
  if (faute<6)
  {
    Serial.println("Bravo! Vous avez trouvé le mot ");
    Serial.print(bonmot);
    Serial.print(" en ");
    Serial.print(faute);
    Serial.print(" faute(s)");
  }
  else
  {
    Serial.println("Dommage! Vous avez perdu vous allez être pendu !");
    Serial.println("Le mot était ");
    Serial.print(bonmot);
    Serial.print(".");
  }
}


J'ai simulé un arduino avec le logiel en ligne https://www.tinkercad.com/ .
Je ne comprend pas le résultat du moniteur de série et cherche a savoir s'il y a des erreurs .
j' obtiens ceci en rentrant : Sport ; 3 .
Bienvenue au jeu du pendu!
Selectionner un thème parmis:
Voiture
Sport
Marque
Selectionner un niveau :
1
2
3
4
5

51„ienvenue au jeu du pendu!
Selectionner un thème parmis:
Voiture
Sport
Marque
0