首页 > 解决方案 > 我的 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",name,age,genders,percent);
    }else{
        printf("\n Error");
    }
    
    
    
}

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

标签: cchar

解决方案


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

  1. 'main' 的返回类型不是 'int'。
  2. 主要:未使用的变量“计数”
  3. 缺少函数的间距和骆驼符号
  4. 您假设读取字符串,但实际上读取的是字符(例如名称、性别字符串的创建等)。
  5. 你试图插入一个字符串,但读取一个字符,你污染了所有的输入缓冲区。
  6. 您正在使用 fflush(...)。请在此处查看为什么不应该使用它:使用 fflush(stdin)
  7. 为了在动态读取名称并将字符分配给字符数组时使用字符串(或字符数组),您需要动态内存或至少 VLA(在以下代码中,您将找到使用动态内存的实现)。
  8. 在“百分比计算器”功能中,您假设为每个主题取多个值。实际上,你每门课只得一分。
  9. 您在读取字符串时出错了。以下是如何正确执行此操作: 如何使用 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(...):如何在 C 中清除输入缓冲区?为了一起正确读取字符和整数。

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

如果您需要它必须是可移植的,请检查我之前放置的链接。希望对您有所帮助。

下一步:

  • 添加用户输入错误处理
  • 在“readGender(...)”中使用开关而不是最后的三元组 if

干杯,丹尼


推荐阅读