0

頭を悩ませています...strcmp_iter内のreturnステートメントが呼び出されないのはなぜですか?

この関数を実行すると、出力は単に0から6までカウントしてから終了します...returnステートメントはありません。非常にイライラします。興味深いことに、myString2を "abcdefG"に変更すると、すべてが正常に機能します...非常に奇妙です。

int strcmp_iter(string s1, string s2) {
  int i = 0;
  for (; ((s1.at(i) == s2.at(i)) && (i <= s1.length())); i++) {
    cout << i << endl;
  }
  return s1.at(i) - s2.at(i);
}


int main() {
  string myString1 = "abcdefg";
  string myString2 = "abcdefg";

  int count_iter = strcmp_iter(myString1, myString2);
  cout << "Iter: " << count_iter << endl;

  return 0;
}
4

3 に答える 3

2

文字列の境界を超えてループしており、おそらくstd::out_of_range例外をスローしています。条件を次のように変更します

i < s1.length()

への呼び出しの前にそのチェックを行いますstd::string::at(size_type pos)

s2また、関数は が少なくとも と同じ長さの場合にのみ機能することに注意してくださいs1。おそらく、 よりも 1 つ少ないループまでループしているはずですstd::min(s1.length(), s2.length())

于 2013-02-26T23:07:25.490 に答える
1

この構造を見るたびに、私はうんざりします。

 for (; ((s1.at(i) == s2.at(i)) && (i <= s1.length())); i++)

C ライクな言語は、常に短絡評価を左から右に実行します。したがって、終了の条件と、比較が意味のあるものであることの検証は、比較の前に行う必要があります。

 int n = s1.length();
 if (s2.length() < n)
       n = s2.length();   // choose smaller length
 for (; i < n  &&  s1.at(i) == s2.at(i); i++)

(また、不要な括弧を削除し、検索の長さを短い文字列に制限し、配列の添字のしくみのために変更<=しました。)<

于 2013-02-26T23:11:40.893 に答える
0
for (; ((s1.at(i) == s2.at(i)) && (i <= s1.length())); i++) {

使用するi < s1.length()

于 2013-02-26T23:09:58.250 に答える