1

假设我们有:

string list[]= {"12.34.56.78","55.34.5","23.44.5"}

我希望用户输入字符串的一部分,这也是一个字符串:例如字符串 55,它将遍历字符串 a 并查找整个字符串并打印"55.34.5" 我正在做的是:

str是字符串输入,list是字符串的完整列表

for (int i=0; i<n; i++){
  for (int j=0; j<(list[i].length()); j++){
    for (int k=0; k<(str.length()); k++){
      if (list[i][j] == str[k])
        cout<<list[i]<<endl;
      else
        break;

但是,这有一个问题,它不能正常工作。

更新:

所以我已将我的代码更新为:

for (int i=0; i<n; i++)
    if (strncmp(list[i].c_str(), str.c_str(), str.length()) == 0)){
      cout<<list[i]<<endl;
      }

但是,这不会输出任何字符串。

4

3 回答 3

2

这只是将 list[i] 中的第一个字符与字符串中的第一个字符进行比较。如果相应的第一个字符匹配,它会打印整个第 i 个字符串,然后将 k (偏移量)推进到您的 str 中,而不会将偏移量更改为您正在比较的字符串。我认为您可以省去内部两个循环,并使用固定长度的字符串比较,即

for (int i=0; i < n; i++) {
  if (strncmp(list[i].c_str(), str.c_str(), str.length()) == 0) {
    // match
  }
}
于 2012-09-25T02:14:59.873 回答
2

对于任何功能狂热者(看到它的工作):

std::string findInList(const std::vector<std::string> &searchFrom, const std::string &lookFor) {
    for (const std::string &s : searchFrom) {
        if (s.find(lookFor) != std::string::npos)
            return s;
    }

    return "";
}

我使用向量而不是数组,因为向量更好,并且不需要额外的工作来获取数组大小。如果不使用 C++11,则正常的 for 循环可以正常工作。

这也假设您希望返回第一个匹配项。一个可能更好的选择是返回一个字符串向量,如果没有找到则为空,这表明没有找到,或者与找到的一样多。不要返回找到的字符串,只需将其添加到向量中并继续,完成后返回向量。

如果您想对标准算法进行建模,您还可以让它采用一个开始迭代器和一个结束迭代器,而不是实际的容器。这将允许您在任何类型的容器(包括数组)上调用它,并且该容器中的任何范围都可以查看。

考虑到这两点,您可以将其演变成这样(看它工作):

template <typename Iterator>
std::vector<std::string> findInList(Iterator start, const Iterator end, const std::string &lookFor) {
   std::vector<std::string> ret;

   for (; start != end; ++start)
       if (start->find(lookFor) != std::string::npos)
           ret.emplace_back(*start);

   return ret;
}

同样,如果不使用 C++11,emplace_back可以换成push_back.

于 2012-09-25T02:23:54.723 回答
0

这是一个结合了前面两个答案的答案。它使用类的查找成员函数std::string

for (int i=0; i < n; i++) {
    if (list[i].find(str) != std::string::npos) {
        std::cout << list[i] << std::endl;
    }
}
于 2012-09-25T12:19:44.310 回答