Posez votre question Signaler

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

Yuku 206Messages postés 22 mars 2008Date d'inscription 22 mars 2012Dernière intervention - Dernière réponse le 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 :
http://img75.imageshack.us/my.php?image=console1bonnejk2.jpg
En revanche, quand on insère des espaces :
http://img374.imageshack.us/my.php?image=console1faussedk1.jpg
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 !
Lire la suite 

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

12 réponses
Réponse
+1
moins plus
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);
Ajouter un commentaire
Réponse
+1
moins plus
De la même manière sauf que tu n'as même pas à indiquer le type.

char NomDeLaChaine[50];
gets(NomDeLaChaine);
Ajouter un commentaire
Réponse
+0
moins plus
D'accord, mais comment fonctionne la fonction gets?
Ajouter un commentaire
Réponse
+0
moins plus
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;
}
bizu53- 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
Ajouter un commentaire
Réponse
+0
moins plus
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 :

http://img225.imageshack.us/my.php?image=erreurdf9.jpg
bizu53- 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 ..
Ajouter un commentaire
Réponse
+0
moins plus
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...).
bizu53- 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..
Ajouter un commentaire
Réponse
+0
moins plus
Je l'ai déjà fait...
bizu53- 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 ?
Ajouter un commentaire
Réponse
+0
moins plus
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 ;)
Ajouter un commentaire
Ce document intitulé « [Langage C]Chaîne de caractères... » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?