2015-04-26 80 views
0

我想分割這條線:分割線到令牌與find()

cmd1; cmd2; cmd3

爲3個字符串,我將股票進入名單。像

cmd1 
cmd2 
cmd3 

所以我做了這個代碼:

main.cpp

#include <string> 
#include <iostream> 
#include <list> 

int  main() 
{ 
    std::string line("cmd1; cmd2; cmd3"); 
    std::list<std::string>  l; 
    size_t  pos = 0; 
    size_t  ex_pos = 0; 

    while ((pos = line.find(';', ex_pos)) != std::string::npos) 
    { 
     l.push_back(line.substr(ex_pos, pos)); 
     ex_pos = pos + 2; 
    } 
    l.push_back(line.substr(ex_pos, pos)); 
    for (std::list<std::string>::iterator it = l.begin(); it != l.end(); ++it) 
    { 
     std::cout << *it << std::endl; 
    } 
    return (0); 
} 

但我不知道爲什麼它返回我:

cmd1 
cmd2; cmd3 
cmd3 

回答

2

第二個參數取代

l.push_back(line.substr(ex_pos, pos)); 

不LAT字符來複制一個指數。它是目標子串的長度。

l.push_back(line.substr(ex_pos, pos-ex_pos)); 

http://www.cplusplus.com/reference/string/string/substr/

+0

哦,是的,我非常愚蠢,非常感謝! 我會在6分鐘內'接受'你的答案:) – nookonee

1

std::basic_string::substr預計,第二個參數一個長度,表示從start_pos開始的子串長度。

string substr (size_t pos = 0, size_t len = npos) const; 

所以,你應該用實際的substr

l.push_back(line.substr(ex_pos, pos - ex_pos)); 
+0

任何想法,爲什麼這個答案會被downvoted? – Abhijit