C ++ ostream输出错误

时间:2015-04-20 18:29:17

标签: c++

我遇到了问题,我无法解决。

注意:我不能使用任何string / strlen / strcmp和这样的函数

我的问题是当我在obj之后尝试打印cin时,当我没有给他打价值时,它打印出垃圾,如果我把价值改成了它就会改变它cin打印得很好。

#ifndef __STRING_H__

#define __STRING_H__

#include <iostream>

using namespace std;

class String {
private:
    char* Str; //pointer to string 
    int Str_s; // size of string public:
    String(char* str = NULL);
    ~String();
    void const print() const; //check
    //~~~~~~~~~~~~~~~~~~
    //    operators
    //~~~~~~~~~~~~~~~~~
    String& operator=(const String& str);
    bool operator==(const String& s) const;
    bool operator!=(const String& s) const;
    void operator-=(const char c);
    void operator+=(const char c);
    char& operator[](const int index) const;
    //~~~~~~~~~~~~~~~~~~
    // i/o ~~ operators
    //~~~~~~~~~~~~~~~~~
    friend ostream& operator<<(ostream&, const String& s);
    friend istream& operator>>(istream&, String& s);
    //~~~~~~~~~~~~~~~~~~
    // arrange method
    //~~~~~~~~~~~~~~~~~
    void Letters(); // arrange all letter in sentence
    void Space(); //remove all unwanted spaces
    void Set_Str_s(int num) {
        this->Str_s = num;
    }
    int Get_Str_s() {
        return this->Str_s;
    }
    //~~~~~~~~~~~~~~~~~~
    //     methods
    //~~~~~~~~~~~~~~~~~
    char const* STR() {
        return Str;
    }
};

#endif

ostream& operator<<(ostream& output, const String& s) {
    //char *c = s.Str;
    //output << c << endl;
    for (int i = 0; i < s.Str_s; i++) {
        cout << s.Str[i];
    }
    return output;
}

istream& operator>>(istream& input, String& s) {
    if (s.Str == NULL) {
        s.Str_s = 0;
        char temp[BUFFER];
        int i = 0, j = 0;
        cin.getline(temp, BUFFER);
        while (temp[i] != NULL) {
            s.Str_s++;
            i++;
        }
        //s.Str = new char[s.Str_s];
        s.Str = temp;
    } else {
        input >> s.Str;
    }
    return input;
}

#include <iostream>
using namespace std;

#include "string_head.h"
#include "Definition_head.h"
#include "Menu_head.h"

int main() {
    char* c = "hi";
    char* h = "lilo";
    String s, m(c);
    cin >> s;
    cin >> m;
    cout << s;
    cout << endl;
    cout << m;
}

1 个答案:

答案 0 :(得分:1)

以下行是一个问题:

    s.Str = temp;

您正在存储指向本地数组的指针,该数组将在函数返回时删除。使用类似的东西:

    s.Str = strdup(temp);

如果您的平台不支持strdup,则可以实施它。这不是太难。

以下行也是一个问题:

    input >> s.Str;

如果没有足够的内存来保存正在读取的字符串,那么你将写入你不应该的内存。