以前慢 发表于 2020-11-4 09:37:32

vs2019scanf和scan_s的区别

#include<stdio.h>
int main(void)
{
        int ASCII;
        printf("Please enter a ASCII.\n");
        scanf("%d",&ASCII);
        printf("%d ASCII is related to %c",ASCII,ASCII);
       
        return 0;
}   
此代码在vs2019中报错
#include<stdio.h>
int main(void)
{
        int ASCII;
        printf("Please enter a ASCII.\n");
        scanf_s("%d",&ASCII);
        printf("%d ASCII is related to %c",ASCII,ASCII);
       
        return 0;
}   
改为scan_s即可运行,求助各位大神这两者的区别是什么?
刚学c的萌新

潇湘剑雨 发表于 2020-11-4 09:52:47


都可以的!是不是报C4996,那只是建议你使用 _s 的而已!

昨非 发表于 2020-11-4 09:54:17

本帖最后由 昨非 于 2020-11-4 10:01 编辑

scnaf()在读取时不检查边界,可能会存在内存泄漏的问题,而scanf_s()在读取时检查边界是一种更加安全的函数
参考https://blog.csdn.net/fuyongsheng135/article/details/50996625?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160445474919724842964014%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=160445474919724842964014&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-1-50996625.pc_first_rank_v2_rank_v28p&utm_term=scanf%E5%92%8Cscanf_s%E5%8C%BA%E5%88%AB&spm=1018.2118.3001.4449
vs2019里scanf会引起安全性问题
不过除了改成scanf_s以外,也可以在首行加上
#define _CRT_SECURE_NO_WARNINGS
来解决
满意的话请给个最佳

风过无痕1989 发表于 2020-11-4 10:39:59

昨天朋友告诉我,设置一下VS2019即可,你试试

jackz007 发表于 2020-11-4 10:49:11

本帖最后由 jackz007 于 2020-11-4 10:53 编辑

    scanf_s() 与 scanf() 在大部分情况下的用法完全一样,唯一不同的地方,就是在输入字符串的时候,需要同时给定一个整型数参数,告诉 scanf_s(),用于保存字符串的字符数组的实际容量,以防止存储空间的越界使用。

#include <stdio.h>

int main(void)
{
      char s                        ;
      printf("your name please : ")      ;
      scanf_s("%s" , s , 256)            ;
      printf("hello, %s, how are you ?\n") ;
}

      就楼主的代码而言,使用 scanf_s() 与使用 scanf() 没有任何区别,只需要直接换函数名就可以了。
页: [1]
查看完整版本: vs2019scanf和scan_s的区别