关于程序中scanf函数失效的解决方法

关于程序中scanf函数失效的解决方法

又是写bug的一天…

在写程序设计进阶课的结课项目时,遇到这样一个bug:

在使用scanf函数读取用户输入时,发现scanf函数被跳过了,无法从键盘输入数据,源代码如下:

//学生信息添加模块
int information_adding_module()
{
    //函数声明
    int file_check();
    int file_create();

    //变量声明
    char whether_exsit;
    char whether_create;

    //添加学生信息菜单
    system("cls");
    printf("******************************************************************\n");
    printf("*                       学生信息维护系统                         *\n");
    printf("******************************************************************\n");
    printf("当前位置:添加学生信息\n");

    whether_exsit=file_check();
    if(whether_exsit==-1)
    {
        printf("信息文件不存在,是否新建信息文件?(y/n)");
        scanf("%c",&whether_create);
        if(whether_create=='y')
        {
            if(file_create()==1)
                printf("文件创建成功!");
            else
                printf("文件创建失败,请重试!");
        }
}

程序执行到 printf(“信息文件不存在,是否新建信息文件?(y/n)”); 处时,跳过了下一行的 scanf 函数。

查找bug原因,发现与scanf函数的读取方式有关。

用户从键盘输入数据时,数据被保存在缓冲区,包括空格、回车、tab等,输入结束按下回车后,程序再从缓冲区读取数据输入程序执行。在这段程序中,调用scanf函数之前缓冲区已经有数据存在(可能是之前输入的回车符之类的,来源不明)导致了程序直接读取了缓冲区内的数据,而不是等待用户输入。

解决方法:使用 fflush() 函数清空缓存区。

fflush(stdin);
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在使用Visual Studio编译器时,如果使用scanf函数,可能会遇到报错提示。报错提示的内容是:“scanf这个函数或者变量可能不安全,考虑使用scanf_s替换,如果想让报错失效的话,请使用 _CRT_SECURE_NO_WARNINGS”。这是由于Visual Studio编译器较为严谨,对于可能存在安全问题的函数给出了警告。 要解决这个问题,可以按照提示将scanf函数替换成scanf_s函数。但需要注意的是,scanf_s函数是Visual Studio特有的函数,其他编译器可能不支持,这会导致代码失去可移植性。因此,并不推荐在跨平台开发时使用scanf_s函数。 另一种解决方法是关闭SDL检查,但这个方法在某些情况下可能会失效。所以,一种更可靠的方式是使用CMake项目来编译代码,这样能够更好地解决在使用Visual Studio时scanf函数报错的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [关于VSscanf函数报错问题的几种解决方法](https://blog.csdn.net/weixin_65931202/article/details/131205106)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [VS2019CMake项目的简单使用方法](https://download.csdn.net/download/weixin_38552239/13740195)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YV_LING

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值