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

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日

悬赏问题

  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持