【问题标题】:match a short string within a long string in c++ [duplicate]在c ++中匹配长字符串中的短字符串[重复]
【发布时间】:2020-11-28 19:20:26
【问题描述】:

我尝试编写一个名为Mystring 的类,它基本上可以完成 std​​::string 类可以做的所有事情。现在我正在尝试编写一个MyString::rfind 函数,它将一个短字符串与长字符串匹配(就像字符串类的rfind 函数一样)。但是,当我运行代码时,控制台中不会打印任何内容。谁能发现问题出在哪里?

//cpp 
size_t MyString::rfind(const MyString& str, size_t pos) const {
    if (str.size() == 0 && pos < s.size()) { return pos; }
    if (str.size() == 0 && pos > (s.size() - 1) ) { return s.size(); }
    size_t a = std::min(pos, (s.size() - 1));
    for (size_t i = a; i >= 0; --i) {
        if (s[a] == str.s[0]) {
            for (size_t b = 1; b < str.size(); ++b) {
                if (s[i + b] != str.s[b]) { break; }
                if (b == (str.size() - 1)) { return i; }
            }
            return -1;
        }

    }
    return -1;
}


//main
int main(){
 
const MyString testMyString = "0123456789";
cout << testMyString.rfind("647")<< endl;
return 0;
}

【问题讨论】:

  • 你的类没有任何接受const char*的构造函数,那么如何编译呢?
  • 基本上可以做 std::string 类可以做的所有事情。 -- 不,它不能。请注意,std::stringstd::basic_string 的特化。那么你准备好实现所有这些功能了吗?
  • s[i + b] 读取到数组末尾
  • 如果pos + str.size() &gt; s.size(),您还可以添加提前退出,这意味着您不需要min 调用。

标签: c++ string class


【解决方案1】:

您的问题在rfind() 函数中:

for (size_t i = a; i >= 0; --i) {

size_t 可以达到的最小值是0。如果在为0 时将其递减,则再次回绕到最大值。在我的 64 位系统上,该值为 18446744073709551615。如您所见,此值大于0,因此循环永远不会结束。

试试这段代码,你会立即看到你的错误:

size_t x = 0;
x--;
cout << x; // What do you think it will print?

【讨论】:

  • 好的,我明白了。它将打印最大的 int。所以我需要做的就是将i &gt;= 0 更改为i&gt;0
  • 是的,这将使它工作。但是,对于当前代码,您可能会看到 18446744073709551615 作为输出。
  • @Waqar 这真的有用吗?它会在字符串的开头找到匹配项,还是在到达之前停止?
  • @Barmar 会吗?我不这么认为。问题是关于陷入无限循环。我回答说把剩下的逻辑留给 OP。 :)
  • 所以您修复了一个错误但用另一个错误替换了它?并且没有提供有关如何修复新错误的任何见解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多