IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> char*引发的一些错误 -> 正文阅读

[C++知识库]char*引发的一些错误

首先了解一下char* 和 char[]区别,

这篇文章【C/C++】对char* 和 char[]区别的一些理解

https://blog.csdn.net/u012611878/article/details/78291036写的很好,推荐看看。

在VS2019中,原来错误的代码

#include <iostream>

class Student 
{
private:
	int m_number;
	char* m_name;
public:
	Student(int number,const char* name);//构造函数
	Student(const Student &s);//拷贝构造函数
	void show();
	void setNumber(int number);
	void setName(char* name);
};

Student::Student(int number,char* name)
{
	m_number = number;
	m_name = new char[strlen(name) + 1]; //申请内存
	strcpy(m_name, name);
}
Student::Student(const Student &s)
{
	m_number = s.m_number;
	m_name = new char[strlen(s.m_name) + 1]; //申请内存
	strcpy(m_name, s.m_name);
}

void Student::setNumber(int number)
{
	m_number = number;
}

void Student::setName(char* name)
{
	if (m_name != nullptr)
	{
		delete []m_name;
		m_name = new char[strlen(name) + 1];
		strcpy(m_name, name);

	}
}

void Student::show()
{
	std::cout << "学号:" << m_number << "\t" << "姓名:" << m_name << std::endl;
}

int main()
{
	Student s1(20210001,"张三");
	s1.setName("张小三");
	s1.show();
	return 0;
}

报错1:
E0289 没有与参数列表匹配的构造函数 “Student::Student” 实例
在这里插入图片描述
错误分析
在这里插入图片描述
张三这个字符串为const char [5] 类型,而类中的构造函数不同。
解决方法
将 char * name 改写为const char* name

报错2:
error C4996: ‘strcpy’: This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.在这里插入图片描述错误分析:使用VS2005以上版本(VS2008、VS2010、VS2013、VS2015、VS2017、VS2019)编译在其他编译器下正常通过的C语言程序都有可能遇到。
这种微软的警告,主要因为那些C库的函数,很多函数内部是不进行参数检测的(包括越界类的),微软担心使用这些会造成内存异常,所以就改写了同样功能的函数,改写了的函数进行了参数的检测,使用这些新的函数会更安全和便捷。库函数改写例子:
mkdir改写为 _mkdir
fopen改写为 fopen_s
stricmp改写为 stricmp_s
strcpy改写为strcpy_s
scanf改写为scanf_s

解决方法1
找到【项目属性】,点击【C/C++】里的【预处理器】,对【预处理器】进行编辑,在里面加入一段代码:_CRT_SECURE_NO_WARNINGS。
在这里插入图片描述

修改后:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

class Student 
{
private:
	int m_number;
	char* m_name;
public:
	Student(int number,const char* name);
	Student(const Student &s);
	void show();
	void setNumber(int number);
	void setName(const char* name);
};

Student::Student(int number,const char* name)
{
	m_number = number;
	m_name = new char[strlen(name) + 1]; //申请内存
	strcpy(m_name, name);
}

Student::Student(const Student &s)
{
	m_number = s.m_number;
	m_name = new char[strlen(s.m_name) + 1]; //申请内存
	strcpy(m_name, s.m_name);
}

void Student::setNumber(int number)
{
	m_number = number;
}

void Student::setName(const char* name)
{
	if (m_name != nullptr)
	{
		delete []m_name;
		m_name = new char[strlen(name) + 1];
		strcpy(m_name, name);

	}
}

void Student::show()
{
	std::cout << "学号:" << m_number << "\t" << "姓名:" << m_name << std::endl;
}

int main()
{
	Student s1(20210001,"张三");
	s1.setName("张小三");
	s1.show();
	return 0;
}

解决方法2:
根据报错提示,用strcpy_s替代strcpy。

#include <iostream>
#include <string>

class Student 
{
private:
	int m_number;
	char* m_name;
public:
	Student(int number,const char* name);
	Student(const Student &s);
	void show();
	void setNumber(int number);
	void setName(const char* name);
};

Student::Student(int number,const char* name)
{
	m_number = number;
	m_name = new char[strlen(name) + 1]; //申请内存
	strcpy_s(m_name, strlen(name) + 1, name);
}

Student::Student(const Student &s)
{
	m_number = s.m_number;
	m_name = new char[strlen(s.m_name) + 1]; //申请内存
	strcpy_s(m_name, strlen(s.m_name) + 1, s.m_name);
}

void Student::setNumber(int number)
{
	m_number = number;
}

void Student::setName(const char* name)
{
	if (m_name != nullptr)
	{
		delete []m_name;
		m_name = new char[strlen(name) + 1];
		strcpy_s(m_name, strlen(name) + 1, name);

	}
}

void Student::show()
{
	std::cout << "学号:" << m_number << "\t" << "姓名:" << m_name << std::endl;
}

int main()
{
	Student s1(20210001,"张三");
	s1.setName("张小三");
	s1.show();
	return 0;
}

结果:

学号:20210001  姓名:张小三

参考网站:
https://blog.csdn.net/u012611878/article/details/78291036
https://blog.csdn.net/weixin_41529093/article/details/102710192
https://blog.csdn.net/cyrilcloud/article/details/115337480

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-04 13:14:05  更:2022-01-04 13:15:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:01:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码