strcpy不安全怎么解决,strcpy运行出错
strcpy函数不安全是什么意思
环境是VC++6.0我们调试程序,发现定义并初始化字符数组a,b后,可以看到数组a和b的地址:数组a的地址是0x0012ff3c数组b的地址是0x0012ff34两个地址之间相差7,a的地址在b的后面执行strcpy(b,a);,程序会把内存地址从0x0012ff3c开始的10个字符(123456789+'\0')复制到内存地址从0x0012ff34开始的10个字节中,但是我们上面看到了,这两个地址相差7,a又在b后面,这样a的首地址内容就会被从写执行完之后,地址0x0012ff3c及之后地址的内容变成了9,‘\0’这样你输出的结果就是123456789,9了执行完strcpy(b,a);之后数组a和b的地址及值:你改变b的大小后,b在内存中的首地址会改变,a能否正确输出,在于两者直接的地址,你可以类似的一一调试你的程序是不安全的,它能否正确执行,在于内存给数组a,b分配的地址。为了保证程序正确,最好的方法是给数组b申请一个至少比a大的空间
vs2013运行程序闪退,设置了SDL关闭
你好,
这是因为strcpy是C的函数,解决方案如下:
右键点击项目-属性-C/C++-预处理(Preprocessor)-第一项(Preprocessor Definition)-编辑-加入"_CRT_SECURE_NO_WARNINGS"
谢谢
error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead.
这个是VS2008以上版本的安全设置问题,缺省编译器会认为原有程序中用的strcpy是不安全的,要改为strcpy_s
运行时说strcpy这个东西不安全,我应该怎么改
这是系统自身的保护功能,你点“是”就可以了,不影响什么的
c语言编程中字符串复制函数编程程序出现错误,这是怎么回事?
这里原因是gets函数不安全,visual studio的后续产品已经不再支持此类函数,可以换成fgets(str1, sizeof(str1), stdin);
第一个参数是,字符存储地址,第二个是最大内存大小,第三个是从哪里读取,stdin是从键盘,也可以是文件指针表示从文件中读取。
其实strcpy出现提示也是不安全的,可以考虑使用strncpy函数。
以下是扩展资料
C语言gets函数,fgets函数的使用
gets从标准输入设备读字符串函数。可以无限读取,不会判断上限,以回车结束读取。函数的具体功能如下所示:从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为‘\0’空字符,并由此来结束字符串。
使用gets函数的时候应注意以下要素:可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,破坏一个或多个不相关变量的值。
这个事实导致gets函数只适用于玩具程序,为了避免这种情况,我们可以用fgets(stdin) 读取标准输入来替换gets()。为了向后兼容,gets删除换行符,gets并不将换行符存入缓冲区。
fgets函数用来从文件中读入字符串。fgets函数的调用形式如下:fgets(str,n,fp);此处,fp是文件指针;str是存放在字符串的起始地址;n是一个int类型变量。函数的功能是从fp所指文件中读入n-1个字符放入str为起始地址的空间内;如果在未读满n-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符。因此,确切地说,调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加'\0',并以str作为函数值返回。原型是char *fgets(char *s, int n, FILE *stream);
同时注意scanf函数和gets函数混用时的注意事项:
1、gets在scanf前调用,这种调用一般不会出现什么问题,可以正常输入。
2、scanf在gets前调用,这种情况就会出现问题,当输入完scanf中的变量时,运行到gets函数,则不让输入任何字符,出现此问题的原因是gets函数接收了scanf输入完后的回车符,解决的办法是在scanf和gets中间,用getchar函数接收掉回车符,这样就不会出现任何问题了。
vs2008中为什么使用strcpy不安全而用strcpy_s替换(尽量详细点)
strcpy_s 函式是 strcpy 的安全版本,属于 ISO/IEC TR 24731 的标准, 某些 C 函式库支援这个函式,包含 Microsoft C Runtime Library(微软 C 语言执行时期函式库)。它与 strcpy 的不同在于,在它取得额外参数来决定目的缓冲区大小时,会因为发生溢位而出现错误,如此一来,就可以预防缓冲区溢位。由于 strcpy_s 对于 C 语言来说是新的函式,所以没有特别受到广泛支援。
例如, 我们有个数组: unsigned char buf[2];
当我们使用strcpy(buf, "1234567")时, 以buf为起点的*(buf+3)也就是buf[3]被写入值, 但是, 此时也许这个buf+3这个位置被其它的程序或变量使用时, 则会改变其它变量的值.
而strcpy_s(buf,2,"1234567")则告诉程序它只有两个字节, 此时, 程序不会将数据写入到 buf+3的地址中, 所以它更安全.