0

こんばんは。タイトルで申し訳ありませんが、問題についてこれ以上正確に説明することはできません。

次のコードは、次の場合を除いて、画面に何も表示しません。

1.最初に3つの未使用のコメント行を延期しましたが、これはいかなる種類の競合も発生しません。

2. main()で「Hello」を「Helloworld」に変更しない限り。

コードブロック10.05を使用しています。

完全なコード:

#include <iostream>
using namespace std;

class stringclass
{
   protected :

      inline bool success()   { failbit = false;  return true; } //line to ignore
      inline bool fail()      { failbit = true; return false; } //line to ignore

   public :

      bool failbit; //line to ignore

      char * mystring;
      long memsize;
      long length;

      void reset();
      void alloc(long newsize);

      void copy(const stringclass & other);

      stringclass(const char str[]);
      stringclass()                          {reset(); }
      stringclass(const stringclass & other) {copy(other); }
      ~stringclass()                         {delete [] mystring;}

      friend ostream& operator << (ostream& out, stringclass & obj)   {out << obj.mystring; return out;}

};

void stringclass::reset()
{
   delete [] mystring;
   mystring = NULL;
   length = 0;
   memsize = 0;
}

void stringclass::alloc(long newsize)
{
   delete [] mystring;

   mystring = new char[newsize];

   memsize = newsize;
   mystring[0] = 0;
   length = 0;
}

void stringclass::copy(const stringclass & other)
{
   if(other.mystring == NULL) reset();
   else
   {
      alloc(other.memsize);
      strcpy(mystring, other.mystring);
      length = strlen(mystring);
   }
}

stringclass::stringclass(const char str[])
   : mystring(NULL), memsize(0), length(0)
{
   if(str == NULL) reset();
   else
   {
      alloc(strlen(str) + 1);
      strcpy(mystring, str);
      length = strlen(mystring);
   }
}

int main()
{
      stringclass str = "Hello";
      stringclass str2 = str;

      cout << "str = " << str << endl;
      cout << "str2 = " << str2 << endl;
      cout << endl;

      system("PAUSE");
      return 0;
}

コードは次のように表示されます。

str =
str2 =

Press any key to continue...

コード変更後1.:

str = Hello
str2 = Hello

Press any key to continue...

コード変更後2.:

str = Hello world
str2 = Hello world

Press any key to continue...
4

3 に答える 3

2

これを実行してみたところ、セグメンテーション違反が発生しました。

コードを読む-文字列がnullで終了しているかどうかを確認していません。strcpy()およびstrlen()は、文字列がnullで終了することを想定しています。それは間違いなくランダムな動作を引き起こします。私はあなたのコードを実行し、セグメンテーション違反を取得しました-そして印刷するときの長さはジャンク値でした。それはおそらくあなたの問題です。

于 2013-01-06T17:29:32.480 に答える
1

明らかなバグがあります:stringclass::reset()そして、それがNULLまたはユニタライズされている場合でもstringclass::alloc() delete[]stringclass::mystringより良い:

stringclass::stringclass()
: mystring(0), memsize(0), length(0) {}

void stringclass::reset()
{
   if(mystring) delete[] mystring;
   mystring = 0;
   memsize = 0;
   length = 0;
}

void stringclass::alloc(long newsize)
{
  if(memsize < newsize) {
    if(mystring) delete[] mystring;
    memsize = newsize;
    mystring = new char[memsize];
  }
  length = 0;
}

など...しかし、はるかに良い:を使用してstd::stringください。

于 2013-01-06T18:09:26.223 に答える
1

stringclassのコピーコンストラクターがクラスメンバーを初期化していない。

このようにコピーコンストラクタを実装すると、機能するはずです。

stringclass::stringclass(const stringclass & other)
: mystring(0), memsize(0), length(0)
{
    copy(other);
}
于 2013-01-06T18:38:48.253 に答える