2016-11-14 48 views
3

讓我有一個字符串:C++ 14名摘錄引用的字符串逐字包括引號

string tstring = "Some arbitrarily long string which has \"double quotes\" which has to be printed verbatim"; 

我試圖使用stringstreams並引述提取的話

stringstream stream(tstring); 
string tepm; 
while(stream >> std::quoted(temp)) 
    cout << temp << endl; 

但上面跳過引號引用的字符串

Some 
arbitrarily 
. 
. 
double quotes 
. 
. 
verbatim 

我想引用的字符串逐字打印,包含引號

Some 
arbitrarily 
. 
. 
"double quotes" 
. 
. 
verbatim 

我怎麼做到這一點使用引用的函數,或者如果它是不可能有一個更好的辦法做到這一點(當然從閱讀逐個字符的分開,做所有的工作我自己)

編輯:

這裏是MCVE的要求

#include <iostream> 
#include <string> 
#include <sstream> 
#include <iomanip> 

using namespace std; 

int main(){ 
    string sspace = "Hi this is \"Real Madrid\""; 
    stringstream stream(sspace); 
    string fpart; 
    while(stream >> quoted(fpart)){ 
     cout << fpart << endl; 
    } 
    return 0; 
} 
+0

'std :: quoted'刪除引號。見http://en.cppreference.com/w/cpp/io/manip/quoted。 「quoted」旨在將引用的子字符串視爲單個項目,忽略空格。 –

+0

@DavidLively我知道引用是刪除引號,因此輸出,有沒有辦法找出它是否被引用並保留引號和字符串? –

+0

嗯..實際上,quoted'的定義似乎表示,當用於像'stream >> std :: quoted(temp)'這樣的輸入時,應該保留轉義的引號。你可以發佈一個完整的,可編譯的*短*樣本嗎? –

回答

2

我不認爲std::quoted是這裏工作的正確工具,因爲沒有簡單的方法可以判斷下一個字符串是否有打印前剝離的引號(它會丟棄您的分隔符,默認爲'\"'

我認爲我們可以安全地回落std::stringfind方法。

  • 包括子程序打印所有的字(空格分隔)不在引號
  • 不斷讀取直到下一個引號字符服用find優勢之內:

全碼:

void PrintUnquoted(std::string _in) 
{ 
    std::istringstream ss(_in); 
    std::string temp; 
    while(ss >> temp) 
    { 
     std::cout << temp << '\n'; 
    } 
} 

int main(){ 
    std::string sspace = "Hi this is \"Real Madrid\" etc."; 
    size_t start = 0; 
    size_t nextQuote = 0; 
    while(nextQuote = sspace.find('\"', start), nextQuote != std::string::npos) 
    { 
     size_t endQuote = sspace.find('\"', nextQuote+1); 
     if (endQuote == std::string::npos) 
     { 
      throw std::logic_error("Unmatched quotes"); 
     } 

     PrintUnquoted(sspace.substr(start, nextQuote-start)); 
     std::cout << sspace.substr(nextQuote, endQuote-nextQuote+1) << std::endl; 
     start = endQuote+1; 
    } 
    if (start < sspace.size()) 
    { 
     PrintUnquoted(sspace.substr(start)); 
    } 
    return 0; 
} 

Live Demo

如果您需要將引用字符存儲在變量中,則該行應該易於修改以獲取該字符。

+0

不錯,我想到了這一點,但是我的代碼太複雜和混亂了,所以只想嘗試其他選項。 –

2

當輸入所使用的,std::quoted去除UNESCAP字符串中的ed引號和un-escapes逃脫了引號。所以像這樣的字符串:

some "string with" inner quotes 

但對於這項工作,該字符串必須實際報價,在流中逃脫:在閱讀時

"some \"string with\" inner quotes" 

成爲這一點。如果你這樣做:

std::string str = "string \"with some\" quotes"; 
std::stringstream ss (str); 
std::cout << "stream contents: " << ss.str() << std::endl; 

流的內容實際上是:

string "with some" quotes 

逸出你在做的時候,宣佈str流中並沒有結束,它的存在只爲分析器。如果你希望它被寫入完全一樣的輸出流中,你必須把它寫這樣的而不是:

std::string str = "\"string \\\"with some\\\" quotes\""; 

或更好:

std::string str = "string \"with some\" quotes"; 
ss << std::quoted(str); 

,並留下std::quoted做的工作。

+0

奇怪的是,雖然這似乎有效,但它與cppreference.com示例中的示例直接衝突。 (http://en.cppreference.com/w/cpp/io/manip/quoted) –

+0

你是對的,但我想將引用的字符串存儲在一個單獨的變量中,我將如何使用你的方法做到這一點?或者至少我需要一種方法來跳過字符串中的空格,除了在引號內 –

+0

@DavidLively它與這個例子有什麼衝突? @VikashB你可以用'quoted'將它寫入'stringstream',然後用'strea.str()'得到流的內容。 – Ionut

相關問題