一.关于C++编译器中对C风格字符串函数的一些经验
1.关于strcmp():strcmp()函数是基于‘\0’比较的,如果在函数实参表中的字符串中没有‘\0’,则strcmp结果不定。如:
char a[5]="abcde";
char b[5]={a,b,c,d,f};
//strcmp(a,b);错误
2.关于strcpy():在VS2017下使用strcpy()函数时编译器会报错:“Consider using strcpy_s instead.”。即建议使用安全版本即strcpy_s().
strcpy_s()有两个版本,参数表分别有两个,三个参数。
三个参数时:
errno_t strcpy_s(
char *strDestination,
size_t numberOfElements,
const char *strSource
);
两个参数时:
errno_t strcpy_s(
char (&strDestination)[size],
const char *strSource
); // C++ only
————————————————
版权声明:本文为CSDN博主「Leonardo Liu」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/leowinbow/article/details/82380252
但是在使用过程中需要注意的是要保证缓冲区的的大小,在使用new指令动态分配空间时,建议使用三个参数的版本,限定字符串长度,这样使用起来编译器才不会报错。
PS:关于strncpy()函数和strnpy_s()函数:实际应用起来与strcpy()的区别在于前者只希望将某一字符串的部分元素拷贝。如下:
char a[100];
cin>>a;
char b[5];
strcpy_s(b,5,a);//错误!
运行结果会报错:Buffer is too small!即表示安全版本不允许将一个长度超过x的字符串复制给长度为x的字符串!
strcpy()函数原型为:char * strncpy(char * str2, char * str1, int size);
strncpy()函数原型为:strncpy_s(char * str2, int size2, char * str1, int size1);
3.在VS2015和2017编译器中,使用不安全版本的c风格字符串函数时,编译器会报错或者warning,解决方法为在stdafx.h头文件中的声明如下指令
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_NONSTDC_NO_DEPECATE
2020.2.4