我的 C 程序没有将全名作为输入,也打印了荒谬的性别值

My C program not taking full name as input and also printing absurd gender value

    #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",name,age,genders,percent);
    }else{
        printf("\n Error");
    }
    
    
    
}

我的代码没有将超过一个字符的名字作为输入,如果我尝试跳过所有内容并且程序结束并且也没有返回性别,而是在控制台中打印出非常荒谬的值。请帮我修复这个错误。

好吧,我一直在阅读您的代码,发现有几个问题。以下是我发现的:

  1. Return 'main' 的类型不是 'int'。
  2. 在 main 中:未使用的变量 'count'
  3. 函数缺少空格和驼峰符号
  4. 你假设读取的是字符串,但实际上你读取的是字符(例如姓名、性别字符串的创建等)。
  5. 您试图插入一个字符串,但读取一个字符,您污染了所有输入缓冲区。
  6. 您正在使用 fflush(...)。请在此处查看您不应该使用它的原因:Using fflush(stdin)
  7. 为了在动态读取名称并将字符分配给字符数组时使用字符串(或字符数组),您需要动态内存或至少 VLA(在下面的代码中,您将找到动态的实现内存)。
  8. 在 'percentage calculator' 函数中,您假设为每个主题取多个值。事实上,你每门课只拿一分。
  9. 你在读取字符串时出错了。以下是正确执行此操作的方法: How to read string from keyboard using C?
  10. 您正试图在最终打印中打印字符而不是字符串。
  11. 请更好地命名变量和函数。

我将在此处附上针对您的问题的工作代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define stringSize 256

char * readGender() {
    fseek(stdin, 0, 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, 0, 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", name, age, gender, percentage);
    } else {
        printf("\n Error");
    }
    return 0;
}

请注意,我按照此处的建议使用了 fseek(...):How to clear input buffer in C? 以便一起正确读取字符和整数。

fseek(...) 适用于某些系统;如果不是,那么也就不足为奇了,因为当标准输入是一个交互设备(或一个不可搜索的设备,如管道、套接字或 FIFO,仅举几个它可以使用的其他方式)时,没有什么能保证它会工作失败)。

如果你需要它必须是便携的,那么检查我之前放置的link。希望对您有所帮助。

后续步骤:

  • 添加用户输入错误处理
  • 在 '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,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[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",name,age,gender,percent);
    }else if(percent >= 33){
        printf(" name : %s \n age : %d \n gender : %s \n Percentage : %f \n Status : Passed",name,age,gender,percent);
    }else{
        printf("\n Error");
    }
    
    
    
}

在这里,我终于解决了代码中的所有问题,现在我的程序可以正常运行了。感谢 Whosebug 社区的一些想法。