Search code examples
cfunctionscanfeofabort

Issue in taking character input to C program


I am trying to run a program that check one input character from user when they enter either M, F or N. It will check and compare char character. but when I run the program. It doesn't work. I have try many medhod with my friends and we can't figure this out. The program can't valid data that user enter. Some help please.

typedef struct {
    char onePatient.gender;
}PATIENT_T

PATIENT_T onePatient;

is a typedef already declared on the top, sorry for that.

This is program function:

void checkGender(char pointerGender)
{
char gender;
char buffer[32];
char word_M = ('M'); /* Male */
char word_F = ('F'); /* Female */
char word_N = ('N'); /* None */

printf("\nEnter Gender: ");
fgets(buffer,sizeof(buffer),stdin);
//strcpy(&gender,buffer);
sscanf(buffer,"%c",&gender);

while((strcasecmp(&gender,&word_M) != 0)||(strcasecmp(&gender,&word_M) != 0)||(strcasecmp(&gender,&word_N) != 0))
{
    printf("\nError: Invalidate Grade");
    printf("\n(Please enter wheather M [for Male], F [for Female] or N [for None])");
    printf("\nEnter gender: ");
    fgets(buffer,sizeof(buffer),stdin);
    //strcpy(&gender,buffer);
    sscanf(buffer,"%c",&gender);
}

}

This is in main function:

int main()
{
    char pointerGender;

    PATIENT_T onePatient;

    checkGender(pointerGender);
    strcpy(&onePatient.gender,&pointerGender);

    printf("\n%s",&onePatient.gender);
}

Terminal show:

192:iHeal Hospital iFluke$ gcc -o checkFormat_Fluke checkFormat_Fluke.c
192:iHeal Hospital iFluke$ ./checkFormat_Fluke

Enter Name: fluke

Enter Gender: M

Error: Invalidate Grade
(Please enter wheather M [for Male], F [for Female] or N [for None])
Enter gender: F

Error: Invalidate Grade
(Please enter wheather M [for Male], F [for Female] or N [for None])
Enter gender: N

Error: Invalidate Grade
(Please enter wheather M [for Male], F [for Female] or N [for None])
Enter gender: 

Solution

  • You can't use strcasecmp to compare characters. It's not completely wrong, but a single character is not a properly terminated string.

    If you must do comparison this way, use strncasecmp:

    if(strncasecmp(&gender,&word_M, 1) == 0)
    

    That will limit it to comparing one character.

    Also, your retry loop doesn't check for 'F', but checks 'M' twice.