查找由换行符分隔的字符串中的特定文本

时间:2016-10-15 21:30:18

标签: c++ string

我想在句子列表中找到一个特定的字符串。每个句子都是以\n分隔的行。当达到换行符时,当前搜索应该停止并在下一行开始新的。

我的节目是:

#include <iostream>
#include <string.h>
using namespace std;
int main(){
    string filename;
    string list = "hello.txt\n abc.txt\n check.txt\n"
    cin >> filename;
    // suppose i run programs 2 times and at 1st time i enter abc.txt
    // and at 2nd time i enter abc
    if(list.find(filename) != std::string::npos){
       //I want this condition to be true only when user enters complete
       // file name. This condition also becoming true even for 'abc' or 'ab' or even for 'a' also

        cout << file<< "exist in list";
    }
    else cout<< "file does not exist in list"
    return 0;
}

有什么办法吗?我想在列表中只找到文件名

2 个答案:

答案 0 :(得分:2)

list.find只会在字符串list中找到子字符串,但如果要比较整个字符串,直到找到\n,您就可以对listlist进行标记。放入一些载体。

为此,您可以将std::istringstream字符串放入std::vector<std::string>并使用std::getline制作std::istringstream ss(list); std::vector<std::string> tokens; std::string temp; while (std::getline(ss, temp)){ tokens.emplace_back(temp); } ,如下所示:

find

如果标记中有前导或尾随空格,您可以在将标记添加到向量之前修剪标记。有关修剪的信息,请参阅What's the best way to trim std::string?,找到适合您的修剪解决方案。

之后,您可以使用<algorithm>中的if (std::find(tokens.begin(), tokens.end(), filename) != tokens.end()) std::cout << "found" << std::endl; 来检查该向量中的完整字符串。

gsutil -h "Cache-Control:public,max-age=10,no-transform" cp  -Z bundle.js gs://lol-champs.tomdid.com 

答案 1 :(得分:1)

首先,我不会将文件列表保存在单个字符串中,但我会使用任何类型的列表或向量。 然后,如果将列表保存在字符串中是你的必需(由于你的应用程序逻辑中的某种原因),我会在向量中分离字符串,然后循环遍历向量的元素,检查元素是否恰好是搜索的元素。 要分割我要做的元素:

std::vector<std::string> split_string(const std::string& str,
                                  const std::string& delimiter)
{
    std::vector<std::string> strings;

    std::string::size_type pos = 0;
    std::string::size_type prev = 0;
    while ((pos = str.find(delimiter, prev)) != std::string::npos)
    {
        strings.push_back(str.substr(prev, pos - prev));
        prev = pos + 1;
    }

    // To get the last substring (or only, if delimiter is not found)
    strings.push_back(str.substr(prev));

    return strings;
}

您可以看到正常工作here

的示例

然后只需使用该功能并将您的代码更改为:

#include <iostream>
#include <string.h>
#include <vector>
using namespace std;
int main(){
string filename;
string list = "hello.txt\n abc.txt\n check.txt\n"
cin >> filename;

vector<string> fileList = split_string(list, "\n");
bool found = false;
for(int i = 0; i<fileList.size(); i++){
    if(fileList.at(i) == file){
        found = true;
    }
}
if(found){
    cout << file << "exist in list";
} else {
    cout << "file does not exist in list";
}
return 0;
}

显然,您需要在代码中的某处声明并实现函数split_string。可能在main声明之前。