C 有没有办法创建一个性别评估
我试图让C程序的用户输入m代表男性,F代表女性 如果不满足M或F,则循环。 下面我尝试了下面的代码,但它循环了两次,给出了正确的答案。 例如,输入M后,it循环并打印 假性别。。请输入M表示男性,输入M表示女性 女性 有什么办法可以解决吗 目标是,如果用户输入M或F,则无需再次输入即可工作。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
如果还有其他问题,它可能会问很多次
#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”结尾,并猜测您想要的是哪一个。。。