Удалить \ n. \ N 'C ++ - PullRequest
       20

Удалить \ n. \ N 'C ++

0 голосов
/ 01 февраля 2010

Если у меня есть строка как таковая

"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 для отправки почты. но очевидно, что если пользователь с внешнего сайта дает sendmail эту команду, я хочу, чтобы он был удален. Вот моя функция сообщения просто incase.:

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

Как бы я поступил так? Заранее спасибо: D

Ответы [ 5 ]

2 голосов
/ 01 февраля 2010

Это получено из ответа Дэна Макга, так что проголосуйте за него;)

2 голосов
/ 01 февраля 2010

Это моя последняя версия:)
Этот код обрабатывает случай, упомянутый @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);
}
2 голосов
/ 01 февраля 2010

Поиск 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);
}
1 голос
/ 01 февраля 2010

Используйте 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, ' ' );
}
1 голос
/ 01 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...