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

我的C程序没有以全名作为输入,也没有打印荒谬的性别值,c,char,C,Char,我的代码不接受一个名称或多个字符作为输入,如果我尝试跳过所有内容和程序结束,也不返回性别,而是在控制台中打印非常荒谬的值。请帮助我修复此错误。好吧,我一直在阅读您的代码,但有几个问题。以下是我发现的: “main”的返回类型不是“int”。 main中:未使用的变量“count” 函数缺少空格和驼峰符号 您假设读取字符串,但实际上您正在读取字符,例如名称、性别字符串的创建等。 您试图插入一个字符串,但读取一个字符会污染所有的输入缓冲区。 您正在使用fflush。。。。请在此处查看您不应使用它的原

我的代码不接受一个名称或多个字符作为输入,如果我尝试跳过所有内容和程序结束,也不返回性别,而是在控制台中打印非常荒谬的值。请帮助我修复此错误。

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

“main”的返回类型不是“int”。 main中:未使用的变量“count” 函数缺少空格和驼峰符号 您假设读取字符串,但实际上您正在读取字符,例如名称、性别字符串的创建等。 您试图插入一个字符串,但读取一个字符会污染所有的输入缓冲区。 您正在使用fflush。。。。请在此处查看您不应使用它的原因: 为了在动态读取名称并将字符分配给字符数组时使用字符串或字符数组,您需要动态内存,或者至少需要VLA。在下面的代码中,您将找到使用动态内存的实现。 在“百分比计算器”功能中,您假设为每个主题获取多个值。事实上,你每门课只考一分。 你在读字符串时出错了。以下是如何正确地做到这一点: 您试图在最终打印中打印字符而不是字符串。 请更好地命名变量和函数。 我将为您的问题附上一个工作代码:

    #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");
    }
    
    
    
}
请注意,我使用了fseek。。。正如这里所建议的:为了正确地同时读取字符和整数

看。。。在某些系统上工作;如果不是,那也就不足为奇了,因为当标准输入是一个交互设备或一个不可查找的设备(比如管道、插座或FIFO)时,没有任何东西可以保证它会工作,仅举几个其他可能失败的方式

如果你需要它必须是可移植的,那么检查我之前放置的链接。希望这是有帮助的

下一步:

添加用户输入错误处理 在“readGender…”中使用一个开关,而不是最后的三元组 干杯,丹尼

#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;
}

在这里,我终于修复了代码中的所有问题,现在我的程序工作正常。感谢stackoverflow社区提供的一些想法。

尝试在启用警告的情况下编译。如果使用GCC,比如GCC-W-Wall-pedantic,我可以马上看到您试图返回一个局部变量,您的scanf尝试将一个字符写入指针,而您不检查scanf返回值。请记住,在C中,字符串需要存储在数组中。您的char*名称不是数组。它没有为字符串分配内存。试试char name[80]。此外,scanf不是读取字符串的最佳工具。如果确实将其用于希望扫描%79s的字符串,请始终确保限制其读取量,否则将导致缓冲区溢出。我会尝试fgetsname,80,stdin,它最多可以读取79个字符,或者直到回车键换行。奇怪的是,从函数返回的字符*性别实际上是可以的。通常当我看到他们是错的。但是,由于您使用的是文字字符串,指针没有指向堆栈。感谢朋友fgets解决了我的名字问题。我使用scanf是因为我的大学教授教我这样做,我对编程非常陌生,所以我使用了它。但性别问题仍有待解决。也许我不应该使用char,而是应该让用户在那里输入数字;。顺便说一句,非常感谢。欢迎@MeekVishi。如果你觉得答案/评论有帮助,请考虑对他们进行投票或将答案标记为有益的。
#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");
    }
    
    
    
}