if(!next.find("+")){//////////////////////searching for +
for(int j=0;j<itemSize;j++){
if(!addItem[j].find(next)){
cout << addItem[j] << endl;//////why doesn't this work for multible words???
}
}
}
if(!next.find("@")){//////////////////////searching for @
for(int j=0;j<itemSize;j++){
if(!addItem[j].find(next)){
cout << addItem[j] << endl;//why doesn't this work for multiple words???
}
}
}
为什么@和+的我的.find()只有在第一个单词中找到它时才返回true?我正在尝试搜索整个字符串,并在找到它时将整个字符串cout。
这是一个命令行参数程序; 如果我的todo.txt包含: “狗” “猫” “鸟+动物” “+动物” 没有“”。
如果我使用.find()搜索+ animal,则只打印最后一个元素。我试图用“鸟+动物”和“+动物”来打印。怎么了?
完整代码::
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <stdlib.h>
using namespace std;
int main(int argc, char* argv[]){
vector<string> addItem;
int numLines =0;
ifstream inDo("todo.txt");
string input;
while(getline(inDo, input)){////////////to get number of lines
numLines++;
addItem.push_back(input);
}
remove("todo.txt");
ofstream todo("todo.txt", std::fstream::app);
for(int i=0; i<argc; i++){
string line = argv[i];
if(!line.find("add")){/////////////////////adds to the list
addItem.push_back(argv[i+1]);
cout << addItem.back() << " - added on line " << numLines+1 << endl;
}
if(!line.find("clear")){////////////////////////////clears the list
while(!addItem.empty()){
addItem.pop_back();
}
cout << "List Has Been Cleared."<< endl;
}
if(!line.find("Do")){////////////////////to remove items from list
if(i+2==argc){
int taskNum = atof(argv[i+1]);
cout << addItem[taskNum-1] << " has been completed << endl;
addItem.erase(addItem.begin()+(taskNum-1));
}
else{
cout << "Incorrect format, please retry with 'do #'" << endl;
}
}
if(!line.find("ls")){/////////////////////////prints the list
if(i+1==argc){
int count=0;
int listSize=addItem.size();
while(count < listSize){
cout << count+1 << " " << addItem[count] << endl;
count++;
}
}
if(i+2==argc){/////////////for searching for a certain word
int itemSize=addItem.size();
string next = argv[i+1];
for(int a=0;a<itemSize;a++){
if(!addItem[a].find(next)){
cout << addItem[a] << endl;
}
}
if(!next.find("+")){/////////////searching for +
for(int j=0;j<itemSize;j++){
if(!addItem[j].find(next)){
cout << addItem[j] << endl;
///doesn't work!!
}
}
}
if(!next.find("@")){//////////////////////searching for @
for(int j=0;j<itemSize;j++){
if(!addItem[j].find(next)){
cout << addItem[j] << endl;
//dosen't work!!
}
}
}
}
}
}
vector<string> temp;////////////////////reverse the vector order
while(!addItem.empty()){
temp.push_back(addItem.back());
addItem.pop_back();
}
while(!temp.empty()){////////////////////send to file
todo << temp.back() << "\n";
temp.pop_back();
}
todo.close();
return 0;
}
答案 0 :(得分:3)
因为string::find
不返回bool
而是std::size_t
,表示找到的子字符串的位置。因此,如果您的子字符串位于字符串的开头,则此函数将返回0
,这在需要逻辑表达式的上下文中被视为false。如果找不到该字符串,或者在不同于0的位置找到该字符串,则会返回非零值(string::npos
或该位置),然后将其视为真。
因此,if (!list.find("whatever"))
不是检查未找到字符串的正确方法。 if (list.find("whatever") == std::string::npos)
是。