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

如何解决我的 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");
    }
    
    
    
}

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

解决方法

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

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

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res