注意"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;
}
Run Code Online (Sandbox Code Playgroud)
输出1:
parameterised constructor
Hello World len = 1819043144 strlen = 11
Run Code Online (Sandbox Code Playgroud)
代码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;
}
Run Code Online (Sandbox Code Playgroud)
输出2:
parameterised constructor
len = 11 strlen = 1
Run Code Online (Sandbox Code Playgroud)
问题出在这里:
char str[];
Run Code Online (Sandbox Code Playgroud)
这是一个零长度数组(标准C++中的BTW,你不能有零长度数组).
这个数组最多可以包含0个字符,所以在你的情况下,零长度数组是没有意义的.
您基本上覆盖了不属于您的内存,并且两个程序的行为都是未定义的.由于行为未定义,因此在两个版本中输出不同的原因也是没有意义的.
试试这个让你有100个大小的字符串:
char str[100];
Run Code Online (Sandbox Code Playgroud)
要在C++中使用字符串,您应该使用std::string原始C字符串.