Обработка строк в C ++ - PullRequest
       2

Обработка строк в C ++

3 голосов
/ 01 июля 2010

Как мне написать функцию в C ++, которая принимает строку s и целое число n в качестве входных данных и дает на выходе строку с пробелами, расположенными каждые n символов в s?

Например, если входное значение равно s = "abcdefgh" и n = 3, то значение должно быть равно "abc def gh"

EDIT:

Я мог бы использовать циклы для этого, но я искал краткого и идиоматического решения C ++ (то есть, которое использует алгоритмы из STL).

EDIT:

Вот как мне это сделать в Scala (это мой основной язык):

def drofotize(s: String, n: Int) = s.grouped(n).toSeq.flatMap(_ + " ").mkString

Возможен ли этот уровень краткости в C ++? Или я все-таки должен использовать явные циклы?

Ответы [ 2 ]

2 голосов
/ 01 июля 2010

Алгоритмы STL на самом деле не предоставляют ничего подобного. Лучшее, что я могу придумать:

#include <string>
using namespace std;

string drofotize(const string &s, size_t n)
{
    if (s.size() <= n)
    {
        return s;
    }
    return s.substr(0,n) + " " + drofotize(s.substr(n), n);
}
2 голосов
/ 01 июля 2010

Скопируйте каждый символ в цикле, а когда i>0 && i%(n+1)==0 добавьте дополнительный пробел в строку назначения.


Что касается стандартной библиотеки, вы можете написать свой собственный std::back_inserter, который будет добавлять дополнительные пробелы, а затем использовать его следующим образом:

std::copy( str1.begin(), str1.end(), my_back_inserter(str2, n) );

но я мог бы сказать, что написание такого функтора - просто трата вашего времени. Намного проще написать функцию copy_with_spaces со старым добрым циклом for.

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