Если вы хотите выполнить работу в C, вы можете попробовать w_wrap.c и w_wrap.h , которые я опубликовал в Fidonet C_ECHO 20 лет назад или около того.
Если выЕсли вы хотите выполнить работу в C ++, кажется, что вы могли бы немного упростить код:
#include <sstream>
#include <string>
#include <iostream>
void wrap(std::string const &input, size_t width, std::ostream &os, size_t indent = 0)
{
std::istringstream in(input);
os << std::string(indent, ' ');
size_t current = indent;
std::string word;
while (in >> word) {
if (current + word.size() > width) {
os << "\n" << std::string(indent, ' ');
current = indent;
}
os << word << ' ';
current += word.size() + 1;
}
}
#ifdef TEST
int main() {
char *in = "Shankle drumstick corned beef, chuck turkey chicken pork chop"
" venison beef strip steak cow sausage. Tail short loin shoulder"
" ball tip, jowl drumstick rump. Tail tongue ball tip meatloaf,"
" bresaola short loin tri-tip fatback pork loin sirloin shank"
" flank biltong. Venison short loin andouille.";
wrap(in, 60, std::cout);
return 0;
}
#endif
Чтобы добавить отступ, вы должны использовать что-то вроде:
wrap(in, 60, std::cout, 5);
Учитывая, чтовы делаете ввод / вывод, это, вероятно, не имеет большого значения в этом случае, но если вы делали это при других обстоятельствах, вы можете рассмотреть другой алгоритм.Вместо того, чтобы копировать по одному слову за раз, пока вы не превысите указанную ширину, вы можете перейти непосредственно к максимальной ширине строки во входных данных и пройти назад по входной строке оттуда, пока не найдете пробел.По крайней мере, учитывая типичную длину слова, вы пройдете только где-то около 3 символов в среднем, а не пройдете вперед в среднем (скажем) 60 символов.Это было бы особенно актуально, если бы вы использовали что-то вроде строки C, где вы сохраняли указатель на начало каждой строки, не копируя содержимое.