Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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