Mareck666
Messages postés56Date d'inscriptionlundi 6 février 2006StatutMembreDernière intervention30 avril 2013
-
24 mai 2006 à 14:18
excrt
Messages postés75Date d'inscriptionmercredi 5 avril 2006StatutMembreDerniè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 :
nightlord666
Messages postés746Date d'inscriptionvendredi 17 juin 2005StatutMembreDernière intervention23 mai 200710 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
}
}
nightlord666
Messages postés746Date d'inscriptionvendredi 17 juin 2005StatutMembreDernière intervention23 mai 200710 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
nightlord666
Messages postés746Date d'inscriptionvendredi 17 juin 2005StatutMembreDernière intervention23 mai 200710 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.
Mareck666
Messages postés56Date d'inscriptionlundi 6 février 2006StatutMembreDernière intervention30 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 ...
nightlord666
Messages postés746Date d'inscriptionvendredi 17 juin 2005StatutMembreDernière intervention23 mai 200710 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.
excrt
Messages postés75Date d'inscriptionmercredi 5 avril 2006StatutMembreDerniè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:
nightlord666
Messages postés746Date d'inscriptionvendredi 17 juin 2005StatutMembreDernière intervention23 mai 200710 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.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 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
nightlord666
Messages postés746Date d'inscriptionvendredi 17 juin 2005StatutMembreDernière intervention23 mai 200710 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.
excrt
Messages postés75Date d'inscriptionmercredi 5 avril 2006StatutMembreDerniè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 !!!