2010-02-01 4 views
0

Если у меня есть строка, как такойRemove « п п.» C++

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

Я хочу, чтобы заменить вышеупомянутую строку так:

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

Просто немного фона на то, что я делаю. Я использую sendmail в C++ и \n.\n: End Of Message Эквивалент sendmail. Я просто создал класс, который использует sendmail для отправки писем. но, очевидно, если пользователь из outsite дает sendmail эту команду, я хочу, чтобы она была удалена. Вот моя функция сообщения просто incase .:

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

Как бы я это сделал. Заранее благодарен: D

+3

Не забудьте также проверить '. \ N' на * начало * сообщения. –

+0

Возможно, было бы лучше добавить новые строки в начале и конце сообщения перед отправкой. Это все равно является частью процесса кодирования. – Potatoswatter

+0

Ооо спасибо. : D '. \ N' забыл об этом. : D –

ответ

2

Это моя последняя версия :)
Этот код обрабатывает случай, упомянутый @Greg 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 –

1

Boost имеет Boost.Regex (a regular expression модуль). Возможно, это будет излишним, если это единственная замена, которую вам нужно сделать.

+0

Да немного перебор, но мне было интересно позже, какие функции регулярных выражений имеют C++. Плюс 1 для решения этого: D –

+0

Мне нужно, чтобы для функции nl2br для C: D –

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. разбить, если источник и замена одинаковы, или любая часть замены является источником. См. Мой ответ для исправленной версии .... –

+0

О, и найти возврат npos вместо 0 при ошибке. –

+0

Это действительно так. –

1

Использование std::search и insert методом последовательных контейнеров, таких как string, deque, или что вы используете для сохранить текст сообщения.

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

2

Это производный от ответа Dan MCG, с тем upvote его;)

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(); 
} 
Смежные вопросы