c ++使用字符串的一部分查找字符串

时间:2012-09-25 02:06:28

标签: c++

我们说:

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;
      }

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

3 个答案:

答案 0 :(得分: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
  }
}

答案 1 :(得分:2)

对于任何狂热分子(see it work):

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循环就可以正常工作。

这也假设您希望返回第一个匹配项。一个可能更好的选择是返回一个字符串向量,如果没有找到则为空,这使得显而易见找不到任何字符串,或者发现其他字符串。不要返回找到的字符串,只需将其添加到矢量并继续,在完成后返回矢量。

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

考虑到这两点,您可以将其演变为此(see it work):

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

答案 2 :(得分:0)

这是一个结合了之前两个答案的答案。它使用std::string

find成员函数
for (int i=0; i < n; i++) {
    if (list[i].find(str) != std::string::npos) {
        std::cout << list[i] << std::endl;
    }
}