2010-06-30 4 views
3

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

Например, если вход 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++? Или я должен использовать явные петли в конце концов?

+5

домашнее задание? пожалуйста, пометьте его как таковой, если это так. –

+1

LOL. Домашнее задание? Я получил диплом в 1994 году: D Это просто, что я новичок в C++ и, следовательно, не очень хорошо знаком со всеми его библиотеками. – Daniel

+1

Где вы его взяли? Игрушки наши? Извините, не смог удержаться. Серьезно, хотя, я бы добавил немного больше, например, мы говорим о строках STL здесь или о старых старых массивах символов с нулевым завершением? –

ответ

2

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


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

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

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

+0

Вы издеваетесь? Вы действительно думаете, что я даже не могу разработать логику цикла? Я хочу более идиоматический (читаем: тот, который использует STL) решение, и именно поэтому я разместил здесь этот вопрос. – Daniel

+0

@ Даниэль, ты даже не упомянул о STL в своем исходном вопросе. Что вы действительно ищете? Не могли бы вы быть более конкретными в своем вопросе? –

+0

Отредактировано мое сообщение. – Daniel

2

Алгоритмы 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); 
} 
+0

Решение с хвостовым рекурсивом. Ницца! – Daniel

+0

Мы можем застрять на C++, но это не значит, что мы не можем быть цивилизованными. ;) –