2016-11-20 63 views
0

以下代码应该使用函数将字符串与分隔符分开。需要将字符串拆分为具有分隔符的向量

考虑下面的函数声明:

vector<string> split(string target, string delimiter); 

我需要实现的功能,使其返回字符串的target矢量由字符串delimiter分离。例如:

split("10,20,30", ",") 

应该返回与琴弦 “10”, “20”,和 “30” 一个vector。同样,

split("do re mi fa so la ti do", " ") 

应该返回与串的vector “做”, “重”, “MI”, “FA”, “所以”, “香格里拉”, “钛” 和 “做”。

我的代码只输出vector的第一个元素。我没有看到函数实现有什么问题。

#include <iostream> 
#include <string> 
#include <vector> 

using namespace std; 

vector<string> split(string, string); 

int main() 
{ 
    vector<string> v; 
    string target; 
    string delim; 
    split(target, delim); 
    v = split(target, delim); 
    for (unsigned long i = 0; i < v.size(); i++) 
     cout << v[i] << " "; 
} 

vector<string> split(string target, string delim) 
{ 
    cout << "Enter string: "<< endl; 
    getline(cin, target); 
    cout << "Enter delimiter:" << endl; 
    getline(cin, delim); 
    vector<string> v; 
    size_t x = target.find(delim); 
    while (x!= string::npos) { 
     v.push_back(target.substr(0,x)); 
     target = target.substr(x); 
     x = target.find(delim); 
    } 
    return v; 
} 
+0

东西显然是不妥的发布代码的平衡''{'VS}',这将是明确的,如果你合理地缩进。你无争议的'return'嵌入*你的'while'循环中。含义:只有一次迭代会发生。 – WhozCraig

+0

这个问题的答案是:使用调试器。 –

回答

0

尝试一些更喜欢这个:

#include <iostream> 
#include <string> 
#include <vector> 

using namespace std; 

vector<string> split(string, string); 

int main() 
{ 
    vector<string> v; 
    string target; 
    string delim; 

    cout << "Enter string: "<< endl; 
    getline(cin, target); 
    cout << "Enter delimiter:" << endl; 
    getline(cin, delim); 

    v = split(target, delim); 
    for (unsigned long i = 0; i < v.size(); i++) 
     cout << v[i] << " "; 
} 

vector<string> split(string target, string delim) 
{ 
    vector<string> v; 
    if (!target.empty()) { 
     string::size_type start = 0; 
     do { 
      size_t x = target.find(start, delim); 
      if (x == string::npos) 
       break; 

      v.push_back(target.substr(start, x-start)); 
      start += delim.size(); 
     } 
     while (true); 

     v.push_back(target.substr(start));    
    } 
    return v; 
}