麻烦打印更大的字符串C ++

时间:2017-07-12 12:44:58

标签: c++ string char ostream

我已经编写了一个用于跟踪错误的类,并在必要时打印出错误消息。现在我正在对着测试人员运行它以确定它是否可以正确检测错误和打印消息,但是我在打印很长的字符串时遇到了麻烦。打印一小串字符(如"短消息")时,代码可以正常工作,但是在对大字符串进行测试时,例如 "一些很长很长很长很长很长的错误消息" "长长多长多长多长多长多长多长长" 它失败了,我不确定我做错了什么。这是我的代码:

标题

#ifndef SICT_ERRORMESSAGE_H__
#define SICT_ERRORMESSAGE_H__
#include <iostream>

namespace sict {
class ErrorMessage {
  char* message_;
public:
  ErrorMessage();
  ErrorMessage(const char* errorMessage);
  ErrorMessage& operator=(const ErrorMessage& em) = delete;
  ErrorMessage& operator=(const char* errorMessage);
  virtual ~ErrorMessage();
  void clear();
  bool isClear()const;
  void message(const char* value);
  const char* message() const;
  std::ostream& write(std::ostream& ostr)const;
};
  std::ostream& operator<<(std::ostream& os, const ErrorMessage& err);
}
#endif

CPP

#define CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include "ErrorMessage.h"
namespace sict{

ErrorMessage::ErrorMessage() {
  message_ = nullptr;
}

ErrorMessage::ErrorMessage(const char* errorMessage) {
  message_ = nullptr;
  message(errorMessage);
}

ErrorMessage& ErrorMessage::operator=(const char* errorMessage) {
  clear();
  message();
  return *this;
}

ErrorMessage::~ErrorMessage() {
  delete [] message_;
}

void ErrorMessage::clear() {
  delete [] message_;
  message_ = nullptr;
}

 bool ErrorMessage::isClear() const {
  if(message_ == nullptr) {
    return true;
  }
  else {
    return false;
  }
}
void ErrorMessage::message(const char* value) {
  delete [] message_;
  message_ = new char[strlen(value) + 1];
  strcpy(message_, value);
  }

const char* ErrorMessage::message() const {
  return message_;
}

std::ostream& ErrorMessage::write(std::ostream& ostr)const {
if (!isClear()) {
  ostr << message_;
}
return ostr;
}

std::ostream& operator<<(std::ostream& os, const ErrorMessage& err) {
  return err.write(os);
}
}

主要

#include <iostream>
#include "ErrorMessage.h"
using namespace std;
using namespace sict;
int main() {
   ErrorMessage T("Testing Error Message");
   ErrorMessage e;
   cout << T << endl << e << endl << "isClear(): " << (e.isClear() ? "Passed!" : "failed!") << endl;
   cout << "===========|\r";
   for (int i = 0; i < 10000000; i++) {
      if (i % 1000000 == 0) {
         cout << "*";
         cout.flush();
  }
      e = "Some error message that is really long long  long  long  long  long  long  long"
     " long  long  long  long  long  long  long  long  long  long  long  long  long"
     " long  long  long  long  long  long  long  long  long  long  long  long  long"
     " long  long  long  long  long  long  long  long  long  long  long  long  long"
     " long  long  long  long  long  long  long  long  long  long  long  long  long"
     " long  long  long  long  long  long  long  long  long  long  long  long  long"
     " long  long  long  long  long  long  long  long  long  long  long  long  long"
     " long  long  long  long  long  long  long  long  long  long  long  long  long"
     " long  long  long  long  long  long  long  long  long  long  long  long  long"
     " long  long  long  long  long  long  long  long  long  long  long  long  long"
     " long  long  long  long  long  long  long  long  long  long  long  long  long"
     " long  long  long  long  long  long  long  long  long  long  long  long  long"
     " long  long  long  long  long  long  long  long  long  long  long  long  long"
     " long  long  long  long  long  long  long  long  long  long  long  long  long"
     " long  long  long  long  long  long  long  long  long  long  long  long  long"
     " long  long  long  long  long  long  long  long  long  long  long  long  long"
     " long  long  long  long  long  long  long  long  long  long  long  long  long"
     " long  long  long  long  long  long  long  long  long  long  long  long  long"
     " long  long  long  long  long  long  long  long  long  long  long  long  long";
   }
   cout << '*' << endl;
   cout << e << endl << "isClear(): " << (e.isClear() ? "Failed!" : "Passed!") << endl;
   e.message("Short Message");
   cout << e << endl << e.message() << endl << "isClear(): " << (e.isClear() ? "Failed!" : "Passed!") << endl;
   e.clear();
   cout << e << endl << "isClear(): " << (e.isClear() ? "Passed!" : "Failed!") << endl;
   return 0;
}

1 个答案:

答案 0 :(得分:1)

您的赋值运算符出错:

ErrorMessage& ErrorMessage::operator=(const char* errorMessage) {
  clear();
  message();    // <-- Here!
  return *this;
}

我认为您打算编写message(errorMessage),它设置存储的错误消息,而不是message(),它会返回存储的错误消息。

尝试更改它,看看是否能解决问题。