Есть ли способ создать гендерную оценку - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь заставить пользователя программы на С ввести M для мужчины и F для женщины и просмотреть, если она не соответствует M или F.Ниже я попробовал следующий код, но он повторяется дважды, давая правильный ответ.Например, после ввода М он зацикливается и печатает

ЛОЖНЫЙ пол. Пожалуйста, введите М для мужчины и М для женщины

, есть ли способ ее решить.

Цельесли пользователь вводит M или F, он будет работать без необходимости вводить его повторно.
если что-то еще может спросить несколько раз

 #include "Gender.h"
 #include<stdio.h>


  char sex;
  void Gender(){

  printf("\nEnter Student Gender ('example M for Male  F for Female):\n");

  scanf(" %s",&sex);



      while (sex != "M" || sex != "M"){
       printf ("\n FALSE gender .. please enter M for Male and M for Female:\n");
        scanf(" %s",&sex);
        printf("\nStudent Sex :%c", sex,"\n");
        return;
      }


  }

Ответы [ 2 ]

5 голосов
/ 24 апреля 2019

sex - это отдельная переменная char, но вы рассматриваете ее как указатель на строку.

  1. Измените свой scanf вызов, чтобы в строке формата было %c (один символ), а не %s.
  2. Измените ваши тесты на значение sex, чтобы использовать одинарные кавычки (т.е. if (sex == 'M')).

Обратите внимание, что хотя этот код не должен нуждаться в сравнении строк, если переменная sex обрабатывается как одиночная char, так и есть, если бы вы сравнивали строки в будущем проекте, вы бы не стали используйте операторы == и != - вместо этого используйте функцию strcmp in <string.h>

1 голос
/ 24 апреля 2019

Несколько вещей, я предоставил реализацию с комментариями ...

Включите ctype.h, чтобы использовать toupper (3) и разрешить ввод как в верхнем, так и в нижнем регистре.Вы можете использовать либо сравнение символов, либо сравнение строк, которое я дал вам обоим, выберите одно.

#include "Gender.h"
#include <stdio.h>

//you should really define these in your Gender.h file...
#define MALE "M"
#define FEMALE "F"
//you should really define these in your Gender.h file...
static const char* GenderAllowed = MALE" for Male and "FEMALE" for Female";
static const char* GenderPrompt = "Enter Student Gender";

//compare as string[1] - keep either this
#include <string.h>
int sexValidc( char* sex ) {
    return ( (0==strncmp(sex,MALE,1)) || (0==strncmp(sex,FEMALE,1)) );
}

//compare only first character - or keep this
#include <ctype.h>
int sexValids( char* sex ) {
    char sexch = toupper(*sex); //fold first character to upper case
    return ( (*MALE==sexch) || (*FEMALE==sexch) );
}

char Gender() {
    char sex[69+1]; //since you wanted to use %s, need a buffer, your &char allows stack overflow & wild memory pointer-ing
    printf("\n%s (%s):\n",GenderPrompt,GenderAllowed); //DRY - Dont Repeat Yourself...
    int done = 0;
    while( !done ) {
        scanf(" %69s",sex); //avoid stackoverflow :-)
        if( !sexValidc( sex ) ) {
//printf("blech, entered: %s\n",sex); //debugging, remove when comfortable
            printf("\n FALSE gender .. %s %s:\n",GenderPrompt,GenderAllowed);
        }
        else { //valid
            done = 1;
        }
    }
    printf("\nStudent Sex :%c\n", *sex);
    return *sex; //once you enter valid value, return it...
}

int main() {
    Gender();
}

Также прочитайте это об автоматическом распределении буферного пространства, разница между% ms и% s scanf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...