[Langage C]Chaîne de caractères...
Résolu
Yuku
Messages postés
199
Date d'inscription
Statut
Membre
Dernière intervention
-
Yuku Messages postés 199 Date d'inscription Statut Membre Dernière intervention -
Yuku Messages postés 199 Date d'inscription Statut Membre Dernière intervention -
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 !
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:
- [Langage C]Chaîne de caractères...
- Langage ascii - Guide
- Caractères spéciaux - Guide
- Chaine tnt gratuite sur mobile - Guide
- Plus de chaine tv - Guide
- Chaine radio - Télécharger - Médias et Actualité
8 réponses
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);
utilise gets() tu pourras
au passage, ce n'est pas :
char NomDeLaChaine[50];
scanf("%s", &NomDeLaChaine);
mais :
char NomDeLaChaine[50];
scanf("%s", NomDeLaChaine);
De la même manière sauf que tu n'as même pas à indiquer le type.
char NomDeLaChaine[50];
gets(NomDeLaChaine);
char NomDeLaChaine[50];
gets(NomDeLaChaine);
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;
}
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;
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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/
https://imageshack.com/
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 ..
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 ..
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...).