0x7A09E689 (ucrtbased.dll)处(位于 TalkBack.exe 中)引发的异常: 0xC0000005: 写入位置 0x01100000 时发生访问冲突。

0x7A09E689 (ucrtbased.dll)处(位于 TalkBack.exe 中)引发的异常: 0xC0000005: 写入位置 0x01100000 时发生访问冲突。_第1张图片

对于上述问题的解决办法:
在用scanf_s()读取字符串的时候需要添加一个读取的字符长长度的参数,即需要将scanf_s("%s",a)改为scanf_s("%s",a,sizeof(a))

在学习C语言时,对于输入函数来讲书上一直在用scanf(),但是VS编译器在都会提示我改成scanf_s(),说是更安全,由于我刚处于入门阶段,一开始只是在读取整数的输入,直到有一天我遇到了这个错误,这是我在第一次尝试读取字符串的狮虎遇到的,那么为啥会出现这个错误呢,我决定还是再详细的看一下scanf_s()这个函数吧。

以下内容参考与:C语言scanf_s()函数的用法

scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc++2005开始,VS系统提供了scanf_s()。在调用该函数时,必须提供一个数字以表明最多读取多少位字符。另外,很多带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,防止hacker利用原版的不安全性(漏洞)黑掉系统。简单的理解,就是scanf_s会比scanf更安全,那么为了安全也需要编程者多传一些参数,这些参数就是变量的长度(占用的字节数)。

对于整数和浮点数而言,和scanf()函数用法相同

    float x ;
    int y;
    scanf_s("%f %d", &x,&y);

对于基本的字符类型,也无需提供大小参数

    char z;
    scanf_s("%c", &z);

在读取字符串的时候必须要提供一个要读取的字符串的大小

    char z[30];
    scanf_s("%s", z,5);
    printf("\n%s", z);

比方说我定义了一个30长度的字符数组,但是在读取的时候只给了一个5的长度,那么他最多只能读取4个字符,因为第五位要存放“\0”,为了不浪费内存空间,第二个参数最好使用sizeof()

    char z[30];
    scanf_s("%s", z,sizeof(z));
    printf("\n%s", z);

总结:在使用scanf_s()读取字符串的时候必须提供一个数字以表明最多读取多少位字符。即scanf_s("%s", 字符串, 字符串长度)

你可能感兴趣的:(C,Primer,Plus,c++)