2010-02-01 114 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(); 
}