为什么string.find()只有在第一个单词中找到它们才返回true?

时间:2013-12-11 21:18:29

标签: c++ string find command-line-arguments

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

1 个答案:

答案 0 :(得分:3)

因为string::find不返回bool而是std::size_t,表示找到的子字符串的位置。因此,如果您的子字符串位于字符串的开头,则此函数将返回0,这在需要逻辑表达式的上下文中被视为false。如果找不到该字符串,或者在不同于0的位置找到该字符串,则会返回非零值(string::npos或该位置),然后将其视为真。

因此,if (!list.find("whatever"))不是检查未找到字符串的正确方法。 if (list.find("whatever") == std::string::npos)是。