[Langage C]Chaîne de caractères...

Résolu
Yuku Messages postés 215 Statut Membre -  
Yuku Messages postés 215 Statut Membre -
Bonjour,

Voilà, je débute en programmation et je suis actuellement en train de m'entraîner sur les chaînes de caractères...
Comme vous le savez, le fameux :

char NomDeLaChaine[50];
scanf("%s", &NomDeLaChaine);

J'ai créé un petit programme pour m'y entraîner, similaire au début du jeu Pokémon : il demande à l'utilisateur son nom, si cela est exact, puis lui affiche son nom et fais de même avec le nom du rival et de sa ville.

Tout se passe bien, sauf dans un cas très précis : si je mets un espace dans l'une des chaînes...

Pour commencer, voici le code de mon programme :



#include <cstdlib>
#include <iostream>
#include <string.h>

using namespace std;

int main(int argc, char *argv[])
{
char util[10], copieutil[10] = {0}, choix;
char adversaire[10], copieadversaire[10] = {0}, choix2;
char OHV[35], copieOHV[10] = {0}, choix3;
do{
printf("\nComment vous appelez-vous?\t");
scanf("%s", &util);
printf("\nVous vous appelez donc %s ? (O=Oui, N=Non)\t", util);
scanf("%s", &choix);
if(choix=='O' && choix!='N')
{
printf("\nD'accord, votre nom est donc ");
}
}while(choix=='N');
strcpy(copieutil, util);
printf("%s !\n\n", copieutil);

do{
printf("\nLe nom de votre rival?\t\t");
scanf("%s", &adversaire);
printf("\nVotre rival est donc %s ? (O=Oui, N=Non)\t", adversaire);
scanf("%s", &choix2);
if(choix2=='O' && choix2!='N')
{
printf("\nAh mais oui, c'est ");
}
}while(choix2=='N');
strcpy(copieadversaire, adversaire);
printf("%s votre rival!\n\n", copieadversaire);

do{
printf("\nEt ou habitez-vous?\t\t");
scanf("%s", &OHV);
printf("\nVous habitez donc a %s ? (O=Oui, N=Non) ?\t", OHV);
scanf("%s", &choix3);
if(choix3=='O' && choix3!='N')
{
printf("\nVous etes donc ");
}
}while(choix3=='N');
strcpy(copieOHV, OHV);
printf("%s, de %s !\n\n\n", copieutil, copieOHV);

system("PAUSE");
return EXIT_SUCCESS;
}


Et maintenant, voilà ce qu'il se passe lorsque l'on insère aucun espace : le programme s'exécute correctement :

https://imageshack.com/

En revanche, quand on insère des espaces :

https://imageshack.com/

Bien entendu, je pourrais indiquer dès le début du programme qu'il ne faut surtout pas insérer d'espace dans sa réponse, mais entre le feignant/pressé qui va ne pas lire et directement se jeter sur la réponse et l'imbécile qui va justement braver l'interdit, il y a fort à faire, vous vous doutez bien.

Quelqu'un aurait-il donc une solution pour moi? :D

Merci d'avance !
A voir également:

8 réponses

Utilisateur anonyme
 
Ouais, normal, c'est un des inconvénient du scanf() pour une chaîne de caractère : on peut pas
utilise gets() tu pourras

au passage, ce n'est pas :

char NomDeLaChaine[50];
scanf("%s", &NomDeLaChaine);

mais :

char NomDeLaChaine[50];
scanf("%s", NomDeLaChaine);
1
Utilisateur anonyme
 
De la même manière sauf que tu n'as même pas à indiquer le type.

char NomDeLaChaine[50];
gets(NomDeLaChaine);
1
Yuku Messages postés 215 Statut Membre 4
 
D'accord, mais comment fonctionne la fonction gets?
0
Yuku Messages postés 215 Statut Membre 4
 
J'ai essayé de modifier

scanf("%s", &util);
scanf("%s", &adversaire);
scanf("%s", &OHV);

par

gets(util);
gets(adversaire);
gets(OHV);

Mais là, le programme accepte le premier prénom et saute ensuite le deuxième...

Voici le code actuel :

#include <cstdlib>
#include <iostream>
#include <string.h>

using namespace std;

int main(int argc, char *argv[])
{
char util[10], choix, adversaire[10], choix2, OHV[35], choix3;
do{
printf("\nComment vous appelez-vous?\t");
gets(util);
printf("\nVous vous appelez donc %s ? (O=Oui, N=Non)\t", util);
scanf("%s", &choix);
if(choix=='O' && choix!='N')
{
printf("\nD'accord, votre nom est donc ");
}
}while(choix=='N');
printf("%s !\n\n", util);

do{
printf("\nLe nom de votre rival?\t\t");
gets(adversaire);
printf("\nVotre rival est donc %s ? (O=Oui, N=Non)\t", adversaire);
scanf("%s", &choix2);
if(choix2=='O' && choix2!='N')
{
printf("\nAh mais oui, c'est ");
}
}while(choix2=='N');
printf("%s votre rival!\n\n", adversaire);

do{
printf("\nEt ou habitez-vous?\t\t");
gets(OHV);
printf("\nVous habitez donc a %s ? (O=Oui, N=Non) ?\t", OHV);
scanf("%s", &choix3);
if(choix3=='O' && choix3!='N')
{
printf("\nVous etes donc ");
}
}while(choix3=='N');
printf("%s, de %s !\n\n\n", util, OHV);

system("PAUSE");
return EXIT_SUCCESS;
}
0
Utilisateur anonyme
 
pourtant chez moi ça passe ...
en même temps je viens de voir que tu n'inclues pas stdio.h, peut-être en est-ce la raison
0

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

Posez votre question
Yuku Messages postés 215 Statut Membre 4
 
Oui, en fait je démarre les programmes console avec DevC++, des fois il me charge les librairies <cstdlib> et <iostream>, d'autres fois <stdio> et <stdlib>... Mais en rajoutant les deux, rien à faire, le problème est le même... Voilà le résultat :

https://imageshack.com/
0
Utilisateur anonyme
 
Oui je vois le genre de "bug" que tu as, j'ai déjà eu... avc le scanf pas avec le gets

as-tu bien remplacé tous les scanf("%s", ...) par gets(...) ?
ça m'étonne aussi de voir des #include sans le .h, à vrai dire je n'ai jamais essayé peut être que ça fonctionne


#include <stdio.h>

int main()
{
char m[50];
char n[50];
char o[50];

printf("m : ");
gets(m);

printf("n : ");
gets(n);

printf("o : ");
gets(o);

printf("m:%s\nn:%s\no:%s\n", m, n, o);

system("pause");
}

je te parle avec ça à côté pour vérifier ce que je dis ..
0
Yuku Messages postés 215 Statut Membre 4
 
De toute façon ceci est ce que j'ai mis dans mon code corrigé... Ce bug m'étonne (pour ne pas dire m'énerve...).
0
Utilisateur anonyme
 
essaye en incluant :

#include <stdio.h>

avec le .h
ça m'intrigue tout ça, je ne vois pas d'autre possibilité de raison de divergence que ça..
0
Yuku Messages postés 215 Statut Membre 4
 
Je l'ai déjà fait...
0
Utilisateur anonyme
 
bah jvois pas ... jpense pas qça soit les options du compilateur même si c'est pas impossible
t'as essayé de copier-coller mon bout de code entièrement pour tester ?
0
Yuku Messages postés 215 Statut Membre 4
 
Ton code marche parfaitement... Je vais essayer de refaire à zéro mon programme en utilisant uniquement des gets et on verra bien... En attendant je file ! Bye et merci ;)
0