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

Résolu/Fermé
Yuku Messages postés 199 Date d'inscription samedi 22 mars 2008 Statut Membre Dernière intervention 22 mars 2012 - 5 oct. 2008 à 21:59
Yuku Messages postés 199 Date d'inscription samedi 22 mars 2008 Statut Membre Dernière intervention 22 mars 2012 - 5 oct. 2008 à 23:56
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

bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 859
5 oct. 2008 à 22:07
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
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 859
5 oct. 2008 à 22:11
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 199 Date d'inscription samedi 22 mars 2008 Statut Membre Dernière intervention 22 mars 2012 4
5 oct. 2008 à 22:09
D'accord, mais comment fonctionne la fonction gets?
0
Yuku Messages postés 199 Date d'inscription samedi 22 mars 2008 Statut Membre Dernière intervention 22 mars 2012 4
5 oct. 2008 à 22:16
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
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 859
5 oct. 2008 à 22:23
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 199 Date d'inscription samedi 22 mars 2008 Statut Membre Dernière intervention 22 mars 2012 4
5 oct. 2008 à 22:27
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
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 859
5 oct. 2008 à 22:32
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 199 Date d'inscription samedi 22 mars 2008 Statut Membre Dernière intervention 22 mars 2012 4
5 oct. 2008 à 22:39
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
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 859
5 oct. 2008 à 22:43
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 199 Date d'inscription samedi 22 mars 2008 Statut Membre Dernière intervention 22 mars 2012 4
5 oct. 2008 à 23:02
Je l'ai déjà fait...
0
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 859
5 oct. 2008 à 23:13
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 199 Date d'inscription samedi 22 mars 2008 Statut Membre Dernière intervention 22 mars 2012 4
5 oct. 2008 à 23:56
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