0

我在挠头……为什么 strcmp_iter 中的 return 语句从未被调用?

当我运行这个函数时,输出只是从 0 计数到 6 然后终止......没有返回语句。非常令人沮丧。有趣的是,如果我将 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. 您可能应该循环最多比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 回答