如何解决我的 C 程序没有输入全名,还打印了荒谬的性别值
#include<stdio.h>
#include<stdlib.h>
char* genderfun(){
char *gender;
char g;
printf("\n >>> enter your gender (M/F/T): ");
//g = getc(stdin);
scanf(" %c",&g);
if(g == 'M'){
gender = "Male";
}else if(g == 'F'){
gender = "Female";
}else{
gender = "Transgender";
}
return gender;
}
float percentagecalculator(){
float math,physics,chemistry,english,other,percent;
printf("\n >>> Enter maths marks: ");
scanf("%f",&math);
printf("\n >>> Enter english marks: ");
scanf("%f",&english);
printf("\n >>> Enter physics marks: ");
scanf("%f",&physics);
printf("\n >>> Enter chemistry marks: ");
scanf("%f",&chemistry);
printf("\n >>> Enter additional subject marks: ");
scanf("%f",&other);
percent = ((math+english+physics+chemistry+other)/500)*100;
return percent;
}
void main(){
char *name;
char* genders;
int age,count;
float percent;
printf(">>> Enter your name: ");
scanf(" %c",&name);
//fflush(stdin);
printf("\n >>> Enter your age: ");
scanf("%d",&age);
genders = genderfun();
percent = percentagecalculator();
if(percent < 33){
printf("\n name : %c \n age : %d \n gender : %c \n Percentage : %f \n Status : Failed",name,age,genders,percent);
}else if(percent >= 33){
printf("\n name : %c \n age : %d \n gender : %c \n Percentage : %f \n Status : Passed",percent);
}else{
printf("\n Error");
}
}
我的代码不会使用一个以上字符的名称作为输入,如果我尝试跳过所有内容并且程序结束,并且性别也不会被返回,而是在控制台中打印出非常荒谬的值。请帮我修复这个错误。
解决方法
嗯,我一直在阅读你的代码,但有几个问题。以下是我发现的:
- 'main' 的返回类型不是 'int'。
- 主要:未使用的变量“计数”
- 缺少函数的间距和驼峰符号
- 您假设读取的是字符串,但实际上您读取的是字符(例如名称、性别字符串的创建等)。
- 您正在尝试插入一个字符串,但读取一个字符会污染所有输入缓冲区。
- 您正在使用 fflush(...)。请在此处查看为什么不应该使用它:Using fflush(stdin)
- 为了在动态读取名称并将字符分配给字符数组时使用字符串(或字符数组),您需要动态内存或至少 VLA(在以下代码中,您将找到动态内存的实现) .
- 在“百分比计算器”功能中,您假设为每个主题采用多个值。实际上,您每门科目只得一分。
- 读取字符串时出错。以下是正确执行此操作的方法: How to read string from keyboard using C?
- 您试图在最终打印中打印字符而不是字符串。
- 请更好地命名您的变量和函数。
我将在此处附上您的问题的工作代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define stringSize 256
char * readGender() {
fseek(stdin,SEEK_END);
char * gender = (char *) malloc(stringSize);
char g;
if (!gender) exit(EXIT_FAILURE);
printf("\n >>> Enter your gender (M/F/T): ");
g = getchar();
if (g == 'M') {
strcpy(gender,"Male");
}else if(g == 'F') {
strcpy(gender,"Female");
}else {
strcpy(gender,"Transgender");
}
gender = (char *) realloc(gender,strlen(gender) + 1);
if (!gender) exit(EXIT_FAILURE);
return gender;
}
float percentageCalculator() {
float math,physics,chemistry,english,other,percent;
printf("\n >>> Enter math mark: ");
scanf("%f",&math);
printf("\n >>> Enter english mark: ");
scanf("%f",&english);
printf("\n >>> Enter physics mark: ");
scanf("%f",&physics);
printf("\n >>> Enter chemistry mark: ");
scanf("%f",&chemistry);
printf("\n >>> Enter additional subject mark: ");
scanf("%f",&other);
percent = ((math + english + physics + chemistry + other) / 500) * 100;
return percent;
}
int main() {
char * gender;
int age;
float percentage;
char *name = (char *) malloc(stringSize);
if (!name) exit(EXIT_FAILURE);
printf(">>> Enter your name: ");
fgets(name,sizeof(stringSize - 1),stdin);
name = (char *) realloc(name,strlen(name));
if (!name) exit(EXIT_FAILURE);
fseek(stdin,SEEK_END);
printf("\n >>> Enter your age: ");
scanf("%d",&age);
gender = readGender();
percentage = percentageCalculator();
if (percentage < 33) {
printf("\n name : %s \n age : %d \n gender : %s \n Percentage : %f \n Status : Failed\n",name,age,gender,percentage);
} else if (percentage >= 33) {
printf("\n name : %s \n age : %d \n gender : %s \n Percentage : %f \n Status : Passed\n",percentage);
} else {
printf("\n Error");
}
return 0;
}
请注意,我已经按照此处的建议使用了 fseek(...):How to clear input buffer in C? 以便正确读取字符和整数。
fseek(...) 适用于某些系统;如果不是,那么也就不足为奇了,因为当标准输入是交互式设备(或诸如管道、套接字或 FIFO 之类的不可查找设备,仅举几个其他方式)时,没有什么能保证它会工作失败)。
如果您需要它必须是可移植的,请查看我之前放置的链接。希望对您有所帮助。
后续步骤:
- 添加用户输入错误处理
- 在 'readGender(...)' 中使用 switch 而不是最后的三元组 if
干杯,丹尼
,#include<stdio.h>
#include<stdlib.h>
/*
# Mistakes to avoid in future
1. use fgets(name_of_inputVariable,size,stdin) instead of scanf
2. use %s for strings rather than %c
3. use *name_of_variable for the strings
4. use fflush(stdin) only when program is skipping a certain step.
5. use switch statements for the character stuff.
*/
char* getGender(){
char *gender,g;
printf(">>> enter a gender (m/f/t): ");
scanf("%c",&g);
switch(g){
case 'm':
gender = "Male";
break;
case 'f':
gender = "Female";
break;
case 't':
gender = "Transgender";
break;
default:
gender = "prefer not to say";
}
return gender;
}
float percentageCalculator(){
float math,percent;
printf("\n >>> Enter maths marks: ");
scanf("%f",&math);
printf("\n >>> Enter english marks: ");
scanf("%f",&english);
printf("\n >>> Enter physics marks: ");
scanf("%f",&physics);
printf("\n >>> Enter chemistry marks: ");
scanf("%f",&chemistry);
printf("\n >>> Enter additional subject marks: ");
scanf("%f",&other);
percent = ((math+english+physics+chemistry+other)/500)*100;
return percent;
}
void main(){
char name[35];
char *gender;
int age,count;
float percent;
printf("\n >>> Enter your name: ");
fgets(name,35,stdin); //fgets is way better than scanf. you can use exact value 35
//scanf("%34s",&name); // scanf is a little buggy. you need to add one value less to prefent buffer overflow i.e. "%34s"
//fflush(stdin); // fflush do solved problem as it took entire name but only printed first character in output. It's fixed via fgets now.
printf("\n >>> Enter your age: ");
scanf("%d",&age);
fflush(stdin); // It was skipping gender ask step,so fflush fixed it by cleaning the overflow buffer. (fixed)
gender = getGender(); // getGender have some problem. It prints very absurd values in output console. (fixed)
percent = percentageCalculator(); // percentage calculator is working 100% fine. I got my accurate percentage and status lol ;)
if(percent < 33){
printf(" name : %s \n age : %d \n gender : %s \n Percentage : %f \n Status : Failed",percent);
}else if(percent >= 33){
printf(" name : %s \n age : %d \n gender : %s \n Percentage : %f \n Status : Passed",percent);
}else{
printf("\n Error");
}
}
在这里,我终于解决了代码中的所有问题,现在我的程序可以正常工作了。感谢 stackoverflow 社区的一些想法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。