Probléme avec les chaines de caractére

Résolu
Mareck666 Messages postés 56 Date d'inscription lundi 6 février 2006 Statut Membre Dernière intervention 30 avril 2013 - 24 mai 2006 à 14:18
excrt Messages postés 75 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 3 juillet 2006 - 25 mai 2006 à 15:30
   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

nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
24 mai 2006 à 14:24
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.
3
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
24 mai 2006 à 15:02
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;
}
3
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
24 mai 2006 à 14:37
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.
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
24 mai 2006 à 14:55
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Mareck666 Messages postés 56 Date d'inscription lundi 6 février 2006 Statut Membre Dernière intervention 30 avril 2013
24 mai 2006 à 14:56
Merci nightlord666 et laurent1024 pour m'avoir apporter la réponce
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
24 mai 2006 à 15:04
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.
0
Mareck666 Messages postés 56 Date d'inscription lundi 6 février 2006 Statut Membre Dernière intervention 30 avril 2013
24 mai 2006 à 15:11
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 ...
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
24 mai 2006 à 15:17
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.
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
24 mai 2006 à 15:21
Pour les continue, break :

BOUCLE <-----\
CODE |
continue -----/
CODE
break -----\
FIN DU WHILE |
CODE <-----/
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
24 mai 2006 à 15:28
Saleté de police d'écriture du forum...
Je t'envoie ça en image :
http://img131.imageshack.us/img131/184/explboucle6nv.jpg
0
Mareck666 Messages postés 56 Date d'inscription lundi 6 février 2006 Statut Membre Dernière intervention 30 avril 2013
24 mai 2006 à 15:40
Désolé mais ya pas d'images dans l'adresse que tu ma donnée
0
Mareck666 Messages postés 56 Date d'inscription lundi 6 février 2006 Statut Membre Dernière intervention 30 avril 2013
24 mai 2006 à 15:44
Oups !!! j'avais pas vu l'extension de fin de l'adresse !


 
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
24 mai 2006 à 15:44
Je te reposte l'image avec la FreeTextbox (je suis donc obligé d'utiliser IE et d'activer mes antivirus...)
0
excrt Messages postés 75 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 3 juillet 2006
24 mai 2006 à 16:38
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 =-=-
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
24 mai 2006 à 16:40
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.
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
24 mai 2006 à 20:18
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
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
24 mai 2006 à 20:57
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.
0
excrt Messages postés 75 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 3 juillet 2006
25 mai 2006 à 15:30
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 =-=-
0
Rejoignez-nous