Probléme avec les chaines de caractére

[Résolu]
Signaler
Messages postés
56
Date d'inscription
lundi 6 février 2006
Statut
Membre
Dernière intervention
30 avril 2013
-
Messages postés
75
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
3 juillet 2006
-
   Salut, Voila j'ai un gros probléme, en faite je voudrais réaliser un chatterbot en c, du genre on rentre une question dans la console et le bot nous répond, mais voila ya un probléme, lorsque je fait une condition sur une chaine entrer au clavier, soit sa quitte soit sa bug
Voici un exemple du code :

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main()
{
       char var;
       printf("Bienvenue dans le Bots déxemple");
       scanf(" %s", &var);

      if (var == "comment tu tapelle par exemple")
      {
           printf("\nJe mapelle bot 2");
           main()
        }
      else if (var == "comment tu ...")
      {
          printf("...");
        main();
}
        [...]
     return 0;
}

18 réponses

Messages postés
746
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
23 mai 2007
10
IL NE FAUT JAMAIS UTILISER == AVEC DES CHAINES DE CARACTERES !!!

va en fait comparer l'adresse de ta chaine avec l'adresse de la chaine constante indiquée.

Solution:
Utilise strcmp(var, "comment tu tapelle par exemple"). Si strcmp renvoie 0, les chaines sont égales, sinon elles sont différentes.
Messages postés
746
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
23 mai 2007
10
Par contre je trouve ça très mauvais de faire un main récursif, d'ailleurs je n'avais jamais vu ça ^^

Utilise plutôt while, break, continue, goto(mais très peu), car sinon au bout d'un certain nombre de commandes, la pile va être surchargée --> erreur (essaye si tu veut, j'en suis sur).

int main()
{
char done = false;
while(!done)
{
char var[500];
printf("Bienvenue dans le Bots déxemple");
scanf(" %s", &var);

if (strcmp(var, "comment tu tapelle par exemple") == 0)
{
printf("\nJe mapelle bot 2");
continue;
}
else if (strcmp(var, "comment tu ...") == 0)
{
printf("...");
continue;
}
//Exemple de break
else if(strcmp(var, "quitter") == 0)
{
break; //On quitte la boucle
}
}

return 0;
}
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
24
De plus       
char var;
scanf(" %s", &var);
c'est tres dangeureux, tu stocke une chaine de carcatere dans une seul char !!!!!

faut au minimim declarer un tableau (char var[500];  par exemple) pour avoir une chaine de carcartere.
Messages postés
746
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
23 mai 2007
10
C'est vrai que le problème vient en plus de cela: tu va stocker un tableau de caractères dans un caractère, ce qui va donner un message d'erreur de windows du type la mémoire ne peut pas être "write", car scanf va utiliser un emplacement mémoire non valide.

Solution:
char var[500]; //Tableau de 500 caractères
Messages postés
56
Date d'inscription
lundi 6 février 2006
Statut
Membre
Dernière intervention
30 avril 2013

Merci nightlord666 et laurent1024 pour m'avoir apporter la réponce
Messages postés
746
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
23 mai 2007
10
En fait on n'aurait même pas besoin du done, mais c'est pour pouvoir quitter la boucle en faisant tout simplement done = true, et en executant quand même le code situé après les else if.
Messages postés
56
Date d'inscription
lundi 6 février 2006
Statut
Membre
Dernière intervention
30 avril 2013

Eh bien je ne savais pas que tous sa existé, quand je pense que sa fait 3 ou 4 mois que j'essaye de trouver la solution a ce probléme alors que la réponce se situer dans la librairie "strin.h", ce qui est évident ...
Messages postés
746
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
23 mai 2007
10
Si tout le monde dit que le C++ est un des langages le plus riche(peut-être même LE plus riche), ce n'est pas pour rien.

Dans string.h, il y a aussi d'autres fonctions qui peuvent être utile dans ton cas comme:

strcat(char* src, const char* dest) pou concaténer des chaines.

strstr(const char* string, const char* searchstring) qui recherche searchstring dans string (si pas trouvé, renvoie NULL, sinon renvoie la sous-chaine(substring en anglais) qui commence par searchstring).

Pour l'explication de toutes ces fonctions : MSDN (je ne sait pas si elles sont dans la version en ligne, mais sur mon VC++ 6.0 elles y sont) ou des tutoriaux en ligne.
Messages postés
746
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
23 mai 2007
10
Pour les continue, break :

BOUCLE <-----\
CODE |
continue -----/
CODE
break -----\
FIN DU WHILE |
CODE <-----/
Messages postés
746
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
23 mai 2007
10
Saleté de police d'écriture du forum...
Je t'envoie ça en image :
http://img131.imageshack.us/img131/184/explboucle6nv.jpg
Messages postés
56
Date d'inscription
lundi 6 février 2006
Statut
Membre
Dernière intervention
30 avril 2013

Désolé mais ya pas d'images dans l'adresse que tu ma donnée
Messages postés
56
Date d'inscription
lundi 6 février 2006
Statut
Membre
Dernière intervention
30 avril 2013

Oups !!! j'avais pas vu l'extension de fin de l'adresse !


 
Messages postés
746
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
23 mai 2007
10
Je te reposte l'image avec la FreeTextbox (je suis donc obligé d'utiliser IE et d'activer mes antivirus...)
Messages postés
75
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
3 juillet 2006

nightlord666, retire les « continue » du while, ils sont _Complètement_ inutiles
le prototype de ton « strcat » est MÔVÈS >>> strcat(char* dst, const char* src)
reprise de ton exemple:

#include <stdio.h> /* printf()/scanf() */
#include <string.h> /* strcmp() */

int main()
{
  char done = 0;
  char chaine[500 + 1]; /* dans le reste du code, on utilise 500, le +1 c'est pour le zéro final( \0 ) */

  printf("Bienvenue dans le Bot d'exemple\n");

  while (!done)
  {
    printf("\ntexte: ");
    scanf("%500s", chaine);

    if (strcmp(chaine, "comment tu tapelle par exemple") == 0) {
      printf("\nJe mapelle bot 2");
    }
    else if (strcmp(chaine, "comment tu ...") == 0) {
      printf("\n...");
    }
    else if (strcmp(chaine, "quitter") == 0) {
      done = 1; //On quitte la boucle
    }
  } /* while() */
  return 0;
}

-=-= ExCRT =-=-
Messages postés
746
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
23 mai 2007
10
Non les continue servent à quelque-chose : dans le premier code, il reexecutait le code en faisant "main();". Je lui ai fait une remarque sur les débordements de pile que cela peut entrainer, et je lui ai dit de les remplacer par des continue, permettant de revenir au debut de la boucle.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Bien il faut faire très attention avec c'est continue. Oui en effet, ils peuvent être utile mais il faut absolument que la variable soit modifié avant (comme un incrémentation de la valeur évalué par exemple) car sinon, la boucle risque d'être infinie.

___________________________________________
Les plus grands esprits trouvent toujours une solution
Messages postés
746
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
23 mai 2007
10
Oui mais vu que c'était contenu dans un if... else if et qu'on attend une chaine "quitter" (dans mon exemple), il n'y a aucun risque car on quitte la boucle gràçe au break dans le else if.
Messages postés
75
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
3 juillet 2006

tes « continue » SONT INUTILES dans ton exemple, regarde mes modifications, aucuns « continue/break/... » et ca fonctionne parfaitement

while ( condition )
{
  /* code... */
  /* code... */
  /* code... */
  if (condition) {
    continue; /* retourne au début de la boucle, tout juste en dessous de « while ( condition ) » */
  }
  /* code... */
  /* code... */
  /* code... */
}

LÀ ca peut être utile, pour éviter l'exécution du code en dessous/après du/le « if (...) »

toujours avec l'exemple, en mettant « done » a 1, ca fait échouer la condition du while >>>  while (!done)  <<< et met donc fin a la boucle !!!

-=-= ExCRT =-=-