我创建了一个程序,该程序可以接收具有1000多个条目的输入文件,格式如下:
年份,类别,获胜,实体
我为一个条目的每个部分创建了一个带有字符串元素的结构。现在,我想请用户输入特定实体的名称,例如“ Emil Jannings”,并返回其所在的索引,以便我可以使用该索引来打印该实体的信息行。
输入文件的前几行是这样的:
年份,类别,获胜者,实体
1927年,演员,假,理查德·巴瑟姆斯(Richard Barthelmess)
1927,ACTOR,TRUE,Emil Jannings
1927年,ACTRESS,FALSE,路易丝梳妆台
如果用户输入“ Emil Jannings”作为输入字符串,我希望我的循环返回它所在的索引。我的问题是,无论如何,循环都会为我返回0。我的循环设置方式从根本上有问题吗?此外,输入文件中存在未知数量的相同实体,Emil Jannings可以显示多次。如何更改循环以继续为我提供找到的每个索引,直到输入文件结束?谢谢。
for(;(getline(in, str)); i++){
istringstream iss(str);
Oscars.push_back(Oscar_Awards());
getline(iss, str2, ',');
Oscars.at(i).year = str2;
getline(iss, str2, ',');
Oscars.at(i).category = str2;
getline(iss, str2, ',');
Oscars.at(i).won = str2;
getline(iss, str2, ',');
Oscars.at(i).entity = str2;
}
cout << "Input Name of Entity" << endl;
string input;
cin >> input;
bool found = false;
for(int i = 0; i < Oscars.size(); i++){
if(Oscars.at(i).entity.find(input)){
cout << "Found at " << i << endl;
found = true;
break;
}
}
答案 0 :(得分:3)
您正在使用string::find
而不是仅将字符串与字符串进行比较。
假设entity
的类型为string
。以下代码应该可以正常工作。
bool found = false;
for(int i = 0; i < Oscars.size(); i++){
if(Oscars[i].entity == input){
cout << "Found at " << i << '\n';
found = true;
break;
}
}
一些要点:
vector::at
进行迭代时,您不需要i < vec.size()
的安全性。答案 1 :(得分:1)
问题出在if(Oscars.at(i).entity.find(input)){
上:无论何时找不到某些文本,std::string::find
都将返回-1。因此,如果第一个条目不包含要搜索的单词,则if(-1)
在第一个条目中将被评估为true。