2016-08-02 32 views
2

我想寫一個程序來分割數字和單詞。該代碼已完成,並且工作正常。我只是想知道如何在輸出結束時刪除逗號。如何在輸出結束時刪除逗號?

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

using namespace std; 
vector<string> split(string targer, string delimiter); 
int main() 
{ 
    string s, delimiter; 
    vector<string> tokens; 
    cout << "Enter string to spilt:" << endl; 
    getline (cin,s); 
    cout << "Enter delimiter string:" << endl; 
    getline (cin,delimiter); 

    tokens = split(s, delimiter); 
    cout << "The substrings are: "; 
    for(int i = 0; i < tokens.size(); i++) 
    { 
    cout << "\"" << tokens[i] << "\"" << "," << " "; 

    } 
    cout<<endl; 
    return 0; 
} 
vector<string> split(string target, string delimiter){ 
stringstream ss(target); 
string item; 
vector<string> tokens; 
while (getline(ss, item, delimiter.at(0))) { 
    tokens.push_back(item); 
} 
return tokens; 
} 
+0

作爲一般建議:如果您期望函數返回一個長向量,則最好使該函數無效,並將非常量向量引用作爲存儲結果的函數的參數。這樣你就可以保存你的程序不必要的副本。 – phil13131

+0

@ phil13131如果寫入'vector tokens = split(s,delimiter);'使RVO有效,那就好了。 – songyuanyao

+0

@ phil13131複製elision是一件事情。 http://en.cppreference.com/w/cpp/language/copy_elision –

回答

4

您可以在DD它的if條件:

for(int i = 0; i < tokens.size(); i++) 
{ 
    if (i != 0) cout << "," << " "; 
    cout << "\"" << tokens[i] << "\""; 
} 

string dlmtr = ""; 
for(int i = 0; i < tokens.size(); i++) 
{ 
    cout << dlmtr << "\"" << tokens[i] << "\""; 
    dlmtr = ", "; 
} 
+0

這種方法的缺點是,即使您知道它只會在邊界發生一次,您仍然在每次迭代中應用測試。 – beldaz

+0

@beldaz這就是第二位候選人存在的原因。 – songyuanyao

+0

呃。仍然看起來像你每次迭代設置dlmtr,即使它在第一次迭代之後從不改變。與明確的測試沒有太大的不同。但這只是一種個人風格的東西。你的是一個非常好的解決方案。 – beldaz

1

嘗試輸出最後cout語句for循環之外,像這樣:

以前的代碼:

for(int i = 0; i < tokens.size(); i++) 
    { 
    cout << "\"" << tokens[i] << "\"" << "," << " "; 

    } 
cout<<endl; 

NEW CODE:

for(int i = 0; i < tokens.size() - 1; i++) 
    { 
    cout << "\"" << tokens[i] << "\"" << "," << " "; 

    } 
if (tokens.size() != 0) 
    cout << "\"" << tokens[tokens.size() - 1] << "\""; 
cout<<endl; 
+1

如果'tokens.size()== 0會很危險 – songyuanyao

+0

@songyuanyao感謝您的觀察。我改變了它。 –

+0

這是比其他人更簡潔的方法。我甚至建議以相反的方式來做這件事,做第一個元素的特殊情況,然後迭代後面以逗號爲前綴的元素。 – beldaz

1
for(int i = 0; i < tokens.size(); i++) 
{ 
    if (i > 0) 
      cout << ", "; 
    cout << '"' << tokens[i] << '"'; 
} 
+0

請解釋你的代碼。 –

+2

@Vaibhav Bajaj - 「請解釋你的代碼」 - 因爲這顯然是一個超大規模的,我作爲OP的excersize來理解我的代碼。這很容易。 「這會不會在最後一個標記[token.size() - 1]之後打印逗號?」 - 不,它不會。 – user31264

+0

是的,我很抱歉,我沒有意識到它最終不會留下逗號。 –

0
size_t i = 0; 

for(; i < tokens.size() - 1; i++) { 
    cout << "\"" << tokens[i] << "\"" << "," << " "; 
} 

if (tokens.size() - 1 >= 0) { 
    cout << "\"" << tokens[i] << "\""; 
} 
0

如何使用退格\b 轉義字符?

就在for循環之外,添加這個ASCII字符。

+0

如果輸出已經交付給客戶,很難做到。退格符追逐不需要的字符,並且接收者可能在退格符趕上之前處理了不正確的消息。例如。串行端口或網絡套接字。 – user4581301