Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 有没有办法创建一个性别评估_C - Fatal编程技术网

C 有没有办法创建一个性别评估

C 有没有办法创建一个性别评估,c,C,我试图让C程序的用户输入m代表男性,F代表女性 如果不满足M或F,则循环。 下面我尝试了下面的代码,但它循环了两次,给出了正确的答案。 例如,输入M后,it循环并打印 假性别。。请输入M表示男性,输入M表示女性 女性 有什么办法可以解决吗 目标是,如果用户输入M或F,则无需再次输入即可工作。 如果还有其他问题,它可能会问很多次 #include "Gender.h" #include<stdio.h> char sex; void Gender(){ print

我试图让C程序的用户输入m代表男性,F代表女性 如果不满足M或F,则循环。 下面我尝试了下面的代码,但它循环了两次,给出了正确的答案。 例如,输入M后,it循环并打印

假性别。。请输入M表示男性,输入M表示女性 女性

有什么办法可以解决吗

目标是,如果用户输入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;
      }


  }
#包括“Gender.h”
#包括
性别;
无效性别(){
printf(“\n输入学生性别('M代表男性F代表女性):\n”);
scanf(“%s”、&sex);
while(sex!=“M”| sex!=“M”){
printf(“\n假性别..请输入M表示男性,输入M表示女性:\n”);
scanf(“%s”、&sex);
printf(“\n学生性别:%c”,性别,“\n”);
返回;
}
}

sex
是单个
char
变量,但您将其视为指向字符串的指针

  • scanf
    调用更改为在格式字符串中包含
    %c
    (单个字符),而不是
    %s
  • 将对
    sex
    值的测试更改为使用单引号(即
    if(sex='M')

  • 请注意,如果变量
    sex
    被视为单个
    char
    ,则此代码不需要进行字符串比较,但如果要在将来的项目中比较字符串,则不会使用运算符
    =
    =-相反,请使用
    中的函数。我提供了一个带有注释的实现

    包括
    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();
    }
    
    #包括“Gender.h”
    #包括
    //你真的应该在你的Gender.h文件中定义这些。。。
    #定义男性“M”
    #定义女性“F”
    //你真的应该在你的Gender.h文件中定义这些。。。
    静态常量char*genderalowed=MALE”表示男性,而“女性”表示女性;
    静态常量char*GenderPrompt=“输入学生性别”;
    //比较为字符串[1]-保留此
    #包括
    int sexValidc(字符*sex){
    返回((0==strncmp(性别,男性,1))| |(0==strncmp(性别,女性,1)));
    }
    //仅比较第一个字符-或保留此字符
    #包括
    int sexValids(字符*sex){
    char sexch=toupper(*sex);//将第一个字符折叠为大写
    返回((*男==sexch)| |(*女==sexch));
    }
    char性别(){
    char sex[69+1];//因为您想使用%s,需要一个缓冲区,所以&char允许堆栈溢出和内存指针溢出
    printf(“\n%s(%s):\n”,GenderPrompt,genderlowed);//DRY-不要重复您自己。。。
    int done=0;
    而(!完成){
    scanf(“%69s”,sex);//避免堆栈溢出:-)
    如果(!sexValidc(sex)){
    //printf(“blech,输入:%s\n”,sex);//调试,调试后删除
    printf(“\n假性别..%s%s:\n”,性别提示,性别降低);
    }
    else{//有效
    完成=1;
    }
    }
    printf(“\n学生性别:%c\n”,*性别);
    return*sex;//输入有效值后,返回它。。。
    }
    int main(){
    性别();
    }
    

    还可以阅读这篇关于自动分配缓冲区空间的文章,

    语句检查
    “M”
    两次时,
    中的表达式。另外,要比较C中的字符串,请使用
    strcmp
    函数。并且使用
    &
    而不是
    |
    %s
    使用前导空格,因此不需要
    %s
    中的空格,但是,您不检查返回值(忽略手动
    EOF
    )并且您无法删除第一个字符之外的任何无关字符(例如,在读取
    sex
    int c=getchar();而(c!='\n'&&c!=EOF)c=getchar();
    )之后),这超出了
    char sex
    %s之间的类型不匹配
    需要一个指向char的指针,该指针具有足够的存储空间来保存字符串(包括nul终止字符),M表示阳性字符,M表示阴性字符(在循环内部)?我认为女士们有权感到恼火。循环中的
    return
    意味着人们会得到一次未经测试的重试。您还丢弃了用户输入的结果-这不是很好。您确实应该返回所选的性别吗?也许值得增加重试次数,并阻止人们进入循环。例如,在10次尝试失败后停止。我可以投票否决分配此任务的讲师吗?应该指出,当用户输入的内容不是M或F时,您应该读取新行字符,并在流中处理该数据。我正在以这种方式尝试;void-Gender(){printf(“\n输入学生性别(例如M表示男性F表示女性):\n”);scanf(%c,&sex);开关(sex){case'M':case'M':printf(“学生性别:男性”);break;case'F':printf(“学生性别:女性”);break;默认值:printf(“\n FALSE SEXT..请输入M代表男性,F代表女性:\n”);}}您只需使用其中一个sexValid函数-我已将名称更改为以“c”和“s”结尾,并猜测您想要的是哪一个。。。