首页 > 解决方案 > 两种情况下的输出不应该相同吗?

问题描述

注意“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

标签: c++dev-c++

解决方案


问题在这里:

char str[];

这是一个零长度数组(顺便说一句,在标准 C++ 中你不能有零长度数组)。

该数组最多可以包含 0 个字符,因此在您的情况下,零长度数组是毫无意义的。

您基本上是在覆盖不属于您的内存,并且您的两个程序的行为都是未定义的。由于行为未定义这一事实,因此解释为什么两个版本的输出不同也是毫无意义的。

试试这个,它可以让你的字符串最大为 100:

char str[100];

要在 C++ 中处理字符串,您应该使用std::string原始 C 字符串。


推荐阅读