3

Wordac 文字列を処理し、、、、演算子をオーバーロードする、 というクラスを<作成しています。><=>=

word.h:

friend bool operator<(const Word &a, const Word &b);

word.cc:

bool operator<(const Word &a, const Word &b) {
  if(a == NULL && b == NULL)
    return false;

  if(a == NULL)
    return true;

  if(b == NULL)
    return false;

  return strcmp(a.wd, b.wd) < 0;  //wd is a valid c string, EDIT: changed to strcmp
}

main:

char* temp = NULL;     //EDIT: i was mistaken, temp is a char pointer
Word a("blah");    //a.wd = [b,l,a,h]
cout << (temp<a);

operator<の最後の行の後、メソッドの最初の行の前にセグメンテーション エラーが発生しますmain。書くことで問題を修正できます

cout << (a>temp);

operator>同様に定義されており、エラーは発生しませんが、割り当てが(temp < a)機能する必要があるため、ここで助けを求めます。

編集:私は初めて間違いを犯し、 temp は typeWordだと言いましたが、実際には typechar*です。Wordしたがって、コンパイラはコンストラクタの 1 つを使用してtemp を a に変換すると仮定します。最初のパラメーターが ではないため、どちらを使用するのか、なぜこれが機能するのかわかりませんWord

Wordこれが、 usingを作成するために使用されていると思われるコンストラクターですtemp

Word::Word(char* c, char* delimeters="\n") {
  char *temporary = "\0";
  if(c == NULL)
    c = temporary;
  check(stoppers!=NULL, "(Word(char*,char*))NULL pointer"); // exits the program if the expression is false
  if(strlen(c) == 0)
    size = DEFAULT_SIZE;  //10
  else
    size = strlen(c) + 1 + DEFAULT_SIZE;
  wd = new char[size];
  check(wd!=NULL, "Word(char*,char*))heap overflow");
  delimiters = new char[strlen(stoppers) + 1];      // EDIT: changed to []
  check(delimiters!=NULL,"Word(char*,char*))heap overflow");
  strcpy(wd,c);
  strcpy(delimiters,stoppers);
  count = strlen(wd);
}

wdタイプですchar*

この大きな質問を見て、助けようとしてくれてありがとう。確認するコードがさらに必要な場合はお知らせください

4

2 に答える 2

1

charのサイズに基づいた整数の初期値を使用して、ヒープ上にを構築するつもりはなかったとほぼ確信していstoppersます。

delimiters = new char(strlen(stoppers) + 1); // Should use [] not ()

また、あなたは C++ を使用しており、何をすべきかは決して教えませんが、危険がないことを正確に知っている場合を除き、使用しないでくださいstrcpy。まさにこの理由からです。

これは文字列のブラインド コピーであり、宛先に十分なスペースがない場合 (タイプミスした割り当ての場合のように)、事態は悪化します。

編集:

私はまた、operator<あなたが使用する過負荷にも見ます

a.wd < b.wd

.wds が有効な C 文字列であると主張します。その場合、単純な < 演算子をそれらに適用することはできずstrcmp、 、strncmpまたは他の完全な比較関数を使用する必要があります

于 2012-10-25T16:48:07.793 に答える
0

コンストラクターの他のビットを切り取ります。

Word::Word(char* c, char* delimeters=NULL) {
    check(stoppers!=NULL, "(Word(char*,char*))NULL pointer");  //exits the program if the expression is false
    delimiters = new char[strlen(stoppers) + 1];
    check(delimiters!=NULL,"Word(char*,char*))heap overflow");
    strcpy(delimiters,stoppers);
}

delimitersメンバー変数 ( ) ではなく、入力パラメーター ( ) に割り当ててコピーしていますstoppers。したがって、あなたが呼び出すとき:

delimiters = new char[strlen(stoppers) + 1];

ここでは、stoppers == NULLcheck呼び出しから推測)そうstrlen(NULL)クラッシュします。

また、

bool operator<(const Word &a, const Word &b)

のようなものをチェックしますa == NULLaおよびが参照であるため、これは必要ないbため、オブジェクトは null ではありません。

null の可能性がある場合は、これらを checkおよびwdに変更する必要があります。a.wdb.wd

于 2012-10-25T17:01:23.707 に答える