今天在编写代码的时候遇到了strcpy和strpy_s两个函数的使用错误,以前编写代码的时候没怎么考虑这个问题,这次遇到并解决后就大致写一下把。
strcpy
char *strcpy( char *to, const char *from )
功能:复制字符串from 中的字符到字符串to,包括空值结束符。返回值为指针to。由于没有字符串长度的限制,所以复制过程中遇到过长的字符串可能会发生未知的错误。
strcpy_s
errno_t __cdecl strcpy_s(char*_Destination,rsize_t _SizeInBytes,char const* _Source)
功能:复制字符串_Source中的字符到字符串_Destination,其中限制了大小为_SizeInBytes,这是为了防止字符串过长超出缓存区内存引发问题而要求的。
参考代码:
#include <iostream>
#include <string> // 字符串赋值需要用到这个指针
//#define _CRT_SECURE_NO_WARNINGS
using namespace std;
class Student
{
private:
char num[10]; // 学号可以看做固定长度的字符串,可以放在一个字符数组中
char* name; // 姓名可以声明为字符指针类型
int score; // 声明成绩
public:
Student(char* nump, char* namep, int scor) // 构造函数调用
{
strcpy_s(num, strlen(nump)+1,nump); // 注意字符数组赋值方式
name = new char[strlen(namep)+1]; // 为name成员分配堆内存
strcpy_s(name,strlen(namep)+1 ,namep); // 用namep给分配的堆空间赋值
score = scor;
cout << "构造函数调用..." << endl;
}
~Student() // 析构函数,用于释放从堆中分配的内存
{
delete[] name;
cout << "析构函数调用..." << endl;
}
void Show()
{
cout << "学号:" << num << endl;
cout << "姓名:" << name << endl;
cout << "成绩:" << score << endl;
}
};
int main()
{
Student Geoge("040120518", "George", 80);
Geoge.Show();
return 0;
}
使用strcpy出现错误 error C4996
改正之后
编译成功
注:
1、这里面使用strcpy_s,中间的参数要使用strlen(xxx)+1的形式
2、这里面如果出现error C2664,请参考我的另一篇博客。
C++出现错误类型error C2664的解决方案