2010-02-01 147 views
0

,如果我有一個字符串作爲這樣刪除 ' n n。' C++

"I am not here... \n..Hello\n.\n....Whats happening" 

我想要替換上面的字符串這樣:

"I am not here... \n..Hello\n. \n....Whats happening" 
          ^Space added 

只是有點上的背景是什麼我正在做。我在C++中使用sendmail和\n.\nEnd Of Message等效的sendmail。我剛剛創建了一個使用sendmail發送郵件的類。但顯然如果來自outsite的用戶給了sendmail這個命令我希望它被刪除。這裏是我的留言功能just incase .:

//Operator to add to the message 
void operator<<(string imessage){ 
    if (imessage != ""){ message += imessage; } 
} 

我該如何去做這件事。提前致謝:D

+3

不要忘記檢查消息的* start *處的'。\ n'。 – 2010-02-01 02:09:15

+0

在發送郵件之前在郵件的開始和結尾添加新行可能是一個更好的主意。無論如何,這都是編碼過程的一部分。 – Potatoswatter 2010-02-01 02:30:20

+0

Ooo謝謝。 :D'。\ n'忘記了這一點。 :D – 2010-02-02 12:18:39

回答

2

這是我的最後一個版本:)
該代碼處理通過@格雷格Hewgill提到的情況下

string& format_text(string& str) 
{ 
    const string::size_type dot_offset = 2; 
    string::size_type found_at_start = str.find("\n.\n"), 
        found_at = str.find("\n.\n"); 

    if(found_at_start != string::npos) 
     str.insert(0, " "); 

    while(found_at != string::npos) 
    { 
     str.insert(found_at+dot_offset+1, " "); 
     found_at = str.find("\n.\n", found_at+1); 
    } 
    return str; 
} 

int main() 
{ 
    string text = ".\nn\n.\nn"; 
    std::cout << format_text(text); 
} 
+0

謝謝工作..:D – 2010-02-01 02:33:00

1

Boost有Boost.Regex(一個regular expression模塊)。如果這是你唯一需要做的替換,可能會過度殺傷。

+0

是有點矯枉過正,但我​​後來想知道C++有哪些正則表達式的功能。加1解決這個問題:D – 2010-02-01 02:35:32

+0

我需要這樣的nl2br函數爲C:D – 2010-02-01 02:36:00

2

查找String.find和與string.replace

例如(未測試)

string endOfMessage = "\n.\n"; 
string replacement = "\n. \n"; 
size_t position; 

while (position = message.find(endOfMessage)) 
{ 
    message.replace(position, endOfMessage.length(), replacement); 
} 
+0

這將A.執行可怕的B.斷裂,如果源和替換是相同的,或者替換的任何部分是源。看到我的答案爲一個更正的版本.... – 2010-02-01 02:21:24

+0

哦,並找到返回npos而不是0失敗。 – 2010-02-01 02:22:54

+0

的確如此。 – 2010-02-01 02:55:29

1

使用std::searchinsert方法序列容器,如stringdeque,或者任何你使用存儲消息文本。

typedef std::string::iterator SIter; // or whatever container you use 
static const char *end_seq = "\n.\n"; 
for (SIter tricky_begin = msg.begin(); 
    tricky_begin = std::search(tricky_begin, msg.end(), end_seq, end_seq+3), 
    tricky_begin != msg.end();) { 
    tricky_begin = msg.insert(tricky_begin + 2, ' '); 
} 
+0

至於新行開始的問題,你應該用一個前導的換行符來初始化消息並保存在那裏。聽起來像是一種廣泛的SMTP格式的語義問題。 – Potatoswatter 2010-02-01 02:28:03

2

這是從丹的McG的回答得出這樣給予好評他;)

string endOfMessage = "\n.\n"; 
string replacement = "\n. \n"; 
size_t position; 

while (position = message.find(endOfMessage, position) != message.npos) 
{ 
    message.replace(position, endOfMessage.length(), replacement); 
    position += replacement.length(); 
}