ㅤ ㅤㅤ ㅤ 2023-01-10 10:27 采纳率: 66.7%
浏览 51
已结题

VSC语言中scanf_s失效


int main()
{
    int input = 0;
    do
    {
        printf("请输入:>");
        scanf_s("%d,", &input);
        fflush(stdin);
        if (input == 1)
        {
            printf("haha");
        }
    } while (input != 1);
    return 0;
}

在VS这段代码中当输入时输入的不是数字时循环不断但是后续的scanf失效了(缓冲区已经清空)

img

  • 写回答

3条回答 默认 最新

  • _leoatliang 2023-01-10 10:35
    关注

    1、scanf_s 是安全版的 scanf,它在 Microsoft Visual C++ 中被引入,主要是为了解决 scanf 函数存在的缓冲区溢出漏洞。scanf_s 函数和 scanf 函数的用法基本相同,但是它多了一些限制条件,比如格式字符串中必须含有小数点和精度说明符,输入输出流必须是有效的文件指针,以及输入字符串的长度必须小于给定的缓冲区大小等。

    2、在你的代码中,你使用的是 scanf_s("%d,", &input),注意到后面的逗号,这样会导致 scanf_s 函数无法正常工作,因为在格式字符串中逗号是无意义的。正确的写法应该是 scanf_s("%d", &input)。

    3、此外,你还使用了 fflush(stdin) 函数,但是在 Windows 平台上 fflush(stdin) 是无效的。你可以使用 fseek 函数来清空输入流,例如:

    fseek(stdin, 0, SEEK_END);
    

    或者,你可以使用 getchar 函数来读取并抛弃输入流中剩余的所有字符,例如:

    int c;
    while ((c = getchar()) != '\n' && c != EOF) {}
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月18日
  • 已采纳回答 1月10日
  • 创建了问题 1月10日

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?