我想在句子列表中找到一个特定的字符串。每个句子都是以\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;
}
有什么办法吗?我想在列表中只找到文件名
答案 0 :(得分:2)
list.find
只会在字符串list
中找到子字符串,但如果要比较整个字符串,直到找到\n
,您就可以对list
和list
进行标记。放入一些载体。
为此,您可以将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
声明之前。