c++ - 两种情况下的输出不应该相同吗?
问题描述
注意“len = strlen(s);”行中两个代码的区别 在代码 1 中:它写在 "strcpy(str,s)" 之前,而在代码 2 中它写在之后。它有什么不同?我在 Dev C++ 中运行我的代码,我得到了不同的输出。两种情况下的输出不应该相同吗?
代码 1:
#include <iostream>
#include <string.h>
using namespace std;
class String{
private:
char str[];
int len;
public:
String()
{
cout << "Default Constructor" << endl;
len = 0;
strcpy(str,"");
}
String(char s[])
{
cout << "parameterised constructor" << endl;
len = strlen(s);
strcpy(str,s);
}
void print()
{
cout << str << " len = " << this->len << " strlen = " << strlen(str) << endl;
}
};
int main()
{
String str2("Hello World");
str2.print();
return 0;
}
输出 1:
parameterised constructor
Hello World len = 1819043144 strlen = 11
代码 2:
#include <iostream>
#include <string.h>
using namespace std;
class String{
private:
char str[];
int len;
public:
String()
{
cout << "Default Constructor" << endl;
len = 0;
strcpy(str,"");
}
String(char s[])
{
cout << "parameterised constructor" << endl;
strcpy(str,s);
len = strlen(s);
}
void print()
{
cout << str << " len = " << this->len << " strlen = " << strlen(str) << endl;
}
};
int main()
{
String str2("Hello World");
str2.print();
return 0;
}
输出 2:
parameterised constructor
len = 11 strlen = 1
解决方案
问题在这里:
char str[];
这是一个零长度数组(顺便说一句,在标准 C++ 中你不能有零长度数组)。
该数组最多可以包含 0 个字符,因此在您的情况下,零长度数组是毫无意义的。
您基本上是在覆盖不属于您的内存,并且您的两个程序的行为都是未定义的。由于行为未定义这一事实,因此解释为什么两个版本的输出不同也是毫无意义的。
试试这个,它可以让你的字符串最大为 100:
char str[100];
要在 C++ 中处理字符串,您应该使用std::string
原始 C 字符串。
推荐阅读
- dynamics-crm - 从 Dynamics 365 CRM 导出带有附件的电子邮件
- java - Java - 不区分大小写的拆分 WITH VARIABLE 拆分字符串
- ruby-on-rails - 使用 Pundit gem 导出所有用户策略
- sql - 在 Oracle 中计算两个字段之间的工作日 (MF)
- python - 蟒蛇基维。如何更改页面布局的方向?
- python - 如何计算 Apache Beam 中的标准差
- python - Django以多对多关系将对象添加到其他对象
- linux - 如何将 .Net 核心 docker 应用程序从 Windows 发布到 Linux 机器?
- reactjs - 如何在 React Native 中将渲染项目设置为状态?
- mysql - 一个查询从其他表值中删除表行