在C ++中自定义实现strcmp不工作

时间:2013-02-26 23:03:52

标签: c++ for-loop

我正在挠头......为什么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;
}

3 个答案:

答案 0 :(得分:2)

您正在循环超出字符串的边界,可能会抛出std::out_of_range异常。将您的条件更改为

i < s1.length()

并在对std::string::at(size_type pos)

的任何调用之前检查

另外,请注意,只有s2s1一样长时,您的功能才有效。您可能应该循环到小于std::min(s1.length(), s2.length())的其中一个。

答案 1 :(得分: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++)

(我还删除了不必要的括号,将搜索长度限制为短字符串,并将<=更改为<,因为数组下标的工作原理。)

答案 2 :(得分:0)

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

使用i < s1.length()