2013-12-11 18 views
-5
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()for @和+只有在第一個單詞中找到它們時才返回true?我試圖搜索整個字符串,並找出整個字符串。爲什麼string.find()僅在第一個單詞中找到它們時才返回true?

這是一個命令行參數程序; 如果我的todo.txt包含: 「狗」 「貓」 「鳥+動物」 「+動物」 沒有「」。

如果我使用.find()搜索+動物,只打印最後一個元素。我試圖「鳥+動物」和「+動物」打印。怎麼了?

完整的代碼::

#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; 
} 
+3

這就是一個loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooootoot代碼。請提供一個簡單的問題例子。 – Manu343726

+1

@ user3092909這個*整個事物不可能是「有問題的部分」。 – 2013-12-11 21:23:15

+0

對不起,我把部分我認爲是錯誤的頂部塊 – user3092909

回答

3

因爲string::find沒有返回bool而是std::size_t,表示發現子的位置。因此,如果您的子字符串位於字符串的開頭,則此函數將返回0,在需要邏輯表達式的上下文中,該函數被視爲錯誤。如果未找到該字符串,或者如果在不同於0的位置找到該字符串,它將返回一個非零值(string::npos或位置),然後視爲真。

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

+0

@ user3092909在字符串'+動物'中,字符''+''在位置0. [證明](http://ideone.com/ YOAJV0)。 – 2013-12-11 21:39:19

+0

作品完美,非常感謝你!我仍然不明白我爲什麼沒有工作,但是好吧,我現在就這樣做。 – user3092909

相關問題