进入操作员时程序输出奇怪的输出?

问题描述

| 我可能在这里缺少明显的东西。这是我的代码(我只是在学习真正的C ++,我想练习一下):
#include <iostream>
#include <cstring>

using namespace std;

class String {
private:
    char * value;
    int len;
    friend ostream & operator<<(ostream & os,String s);
public:
    String();
    String(const char * base);
    ~String();
    String operator+(String s);
    String operator*(int n);
    int length();
};

String::String() {
    this->value = new char[0];
    this->len = 0;
}

String::String(const char * base) {
    this->value = new char[this->len = strlen(base)];
    strcpy(this->value,base);
}

String::~String() {
    delete [] this->value;
}

int String::length() {
    return this->len;
}

String String::operator+(String s) {
    String n;
    delete [] n.value;

    cout << \"Upon entering,I am: \\\"\" << *this << \"\\\"\\n\";

    n.value = new char[this->len + s.len];
    for(int i = 0; i < this->len; i++) {
        n.value[i] = this->value[i];
    }
    for(int i = 0; i < s.len; i++) {
        n.value[i + this->len] = s.value[i];
    }

    n.len = this->len + s.len;

    cout << \"String::operator+(\" << *this << \",\" << s << \") succeeded with new value = \\\"\" << n << \"\\\"\\n\";

    return n;
}

String String::operator*(int n) {
    String s;
    delete [] s.value;

    s.value = new char[this->len * n];

    for(int i = 0; i < this->len * n; i++) {
        s.value[i] = this->value[i % this->len];
    }

    cout << \"String::operator* succeeded with new value = \\\"\" << s << \"\\\"\\n\";

    return s;
}

ostream & operator<<(ostream & os,String s) {
    return os << s.value;
}

int main() {
    String s(\"Hello,world!\");
    cout << s << \"\\nLength = \" << s.length() << \"\\n\\n\";
    cout << (s + String(\"\\n\")) * 5;
    return 0;
}
字符串初始化并正确显示,但是我的输出确实很奇怪。似乎在输入运算符+时,““世界,您好!””突然变成“ x%r \”?
C:\\Users\\Ryan\\Documents\\My DropBox\\C++ Projects>strings
Hello,world!
Length = 13

Upon entering,I am: \"x%r\"
String::operator+(x%r,) succeeded with new value = \"x%r\"
String::operator* succeeded with new value = \"╚%r\"
─
    

解决方法

尝试这个:
ostream & operator<<(ostream & os,const String& s) {
    return os << s.value;
}
否则,您应该为String类定义复制构造函数。     ,您需要提供复制构造函数和赋值运算符。     ,您的代码有很多问题。 您正在管理自己的内存。您应尽可能避免这样做。 您因此而忘记了字符串具有空终止符。为了容纳字符串
Hello,world!
,您需要一个14字节而不是13字节的char缓冲区。 您有一个
len
成员变量,实际上与
strlen
函数具有相同的作用,只是上面#1的考虑不一致。 您的字符串类没有复制构造函数,该构造函数会导致野生指针并最终导致崩溃。 这是代码重构,几乎可以正常工作。
#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <cstring>

using namespace std;

class String {
private:
    char * value;
//    size_t len;
    friend ostream & operator<<(ostream & os,String s);
public:
    String();
    String(const char * base);
    String(const String& rhs) 
    {
        value = new char[strlen(rhs.value)+1];
        strcpy(value,rhs.value);
    }
    ~String();
    String operator+(String s);
    String operator*(int n);
    size_t length();
};

String::String() {
    this->value = new char[0];
}

String::String(const char * base) {
    this->value = new char[strlen(base)+1];
    strcpy(this->value,base);
}

String::~String() {
    delete [] this->value;
}

size_t String::length() {
    return strlen(value);
}

String String::operator+(String s) {
    String n;
    delete [] n.value;

    cout << \"Upon entering,I am: \\\"\" << *this << \"\\\"\\n\";

    n.value = new char[strlen(value)+strlen(s.value)+1];
    for(int i = 0; i < strlen(value); i++) {
        n.value[i] = this->value[i];
    }
    for(int i = 0; i < strlen(s.value); i++) {
        n.value[i + strlen(value)] = s.value[i];
    }
    n.value[strlen(value)+strlen(s.value)] = \'\\0\';

    cout << \"String::operator+(\" << *this << \",\" << s << \") succeeded with new value = \\\"\" << n << \"\\\"\\n\";

    return n;
}

String String::operator*(int n) {
    String s;
    delete [] s.value;

    s.value = new char[(strlen(value)*n)+1];

    for(int i = 0; i < strlen(value) * n; i++) {
        s.value[i] = this->value[i % strlen(value)];
    }
    s.value[strlen(value)*n] = \'\\0\';

    cout << \"String::operator* succeeded with new value = \\\"\" << s << \"\\\"\\n\";

    return s;
}

ostream & operator<<(ostream & os,String s) {
    return os << s.value;
}

int main() {
    String s(\"Hello,world!\");
    cout << s << \"\\nLength = \" << s.length() << \"\\n\\n\";
    cout << (s + String(\"\\n\")) * 5;
    return 0;
}
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...