#1 Le 10/01/2011, à 00:26
- Lyaskator
[résolu] C - if / else qui ne s'exécute pas
Bonjour,
j'ai essayé de faire un petit programme pour m'entraîner à utiliser wchar_t, mais malheureusement il plante, pas à la compilation mais à l'exécution, la condition if (toi.homme) ne semble pas être évaluée le moins du monde, comme si le programme terminait juste avant.
Voici le code :
#include <stdio.h>
#include <locale.h>
#include <wchar.h>
#define MAX 50
typedef struct
{
wchar_t nom[MAX];
wchar_t prenom[MAX];
long age;
int homme;
} Utilisateur;
void buffer_empty();
void structure_fill(Utilisateur * personne);
int main(int argc, char **argv)
{
setlocale(LC_CTYPE, "");
Utilisateur toi;
structure_fill(&toi);
wprintf(L"Tu t'appelles donc %ls %ls, tu as %ld ans ", toi.prenom, toi.nom, toi.age);
if (toi.homme)
{
printf("et tu es un homme.\n");
}
else
{
printf("et tu es une femme.\n");
}
return 0;
}
void buffer_empty()
{
int buffer_unit = 1;
while((buffer_unit != '\n') && (buffer_unit != EOF))
{
buffer_unit = getchar();
}
}
void structure_fill(Utilisateur * personne)
{
wprintf(L"Quel est ton nom ? ");
if (fgetws(personne->nom, MAX, stdin) != NULL)
{
wchar_t * newline_mark = NULL;
newline_mark = wcschr(personne->nom, L'\n');
if (newline_mark == NULL)
{
buffer_empty();
}
else
{
* newline_mark = L'\0';
}
}
else
{
buffer_empty();
}
wprintf(L"Quel est ton prénom ? ");
if (fgetws(personne->prenom, MAX, stdin) != NULL)
{
wchar_t * newline_mark = NULL;
newline_mark = wcschr(personne->prenom, L'\n');
if (newline_mark == NULL)
{
buffer_empty();
}
else
{
* newline_mark = L'\0';
}
}
else
{
buffer_empty();
}
wchar_t saisie_age[MAX];
do
{
wprintf(L"Quel est ton âge ? ");
if (fgetws(saisie_age, MAX, stdin) != NULL)
{
wchar_t * newline_mark = NULL;
newline_mark = wcschr(saisie_age, L'\n');
if (newline_mark == NULL)
{
buffer_empty();
}
else
{
* newline_mark = L'\0';
}
}
else
{
buffer_empty();
}
} while (wcstol(saisie_age, NULL, 10) == 0);
personne->age = wcstol(saisie_age, NULL, 10);
wchar_t saisie_sexe[MAX];
do
{
wprintf(L"Es-tu un homme (h) ou une femme (f) ? ");
if (fgetws(saisie_sexe, MAX, stdin) != NULL)
{
wchar_t * newline_mark = NULL;
newline_mark = wcschr(saisie_sexe, L'\n');
if (newline_mark == NULL)
{
buffer_empty();
}
else
{
* newline_mark = L'\0';
}
}
else
{
buffer_empty();
}
} while((wcscmp(saisie_sexe, L"h") != 0) && (wcscmp(saisie_sexe, L"f") != 0));
personne->homme = (wcscmp(saisie_sexe, L"h")) ? 0 : 1;
}
Tout le reste fonctionne.
J'ai beau me creuser la tête, je ne vois pas ce qui provoque cette erreur.
Merci d'avance.
Dernière modification par Lyaskator (Le 10/01/2011, à 12:29)
Hors ligne
#2 Le 10/01/2011, à 04:35
- ehmicky
Re : [résolu] C - if / else qui ne s'exécute pas
Je ne reçois personnellement pas de segfault : toi.homme vaut 1 ou 0 selon 'h' ou 'f', et je peux écrire dessus.
Compilé/exécuté avec :
$ gcc -Wall a.c && ./a.out
Dernière modification par ehmicky (Le 10/01/2011, à 05:57)
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#3 Le 10/01/2011, à 10:38
- Lyaskator
Re : [résolu] C - if / else qui ne s'exécute pas
edit : c'est bon, c'est résolu. En fait, c'était les printf, il fallait les remplacer par
if (toi.homme)
{
wprintf(L"et tu es un homme.\n");
}
else
{
wprintf(L"et tu es une femme.\n");
}
Dernière modification par Lyaskator (Le 10/01/2011, à 12:31)
Hors ligne