#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cctype>
#include <sstream>
// invariant: line_sz > length of any single word
std:: vector < std:: string > split( std:: string str, std:: size_t line_sz )
{
if ( std:: all_of ( std:: begin ( str) , std:: end ( str) , [ ] ( char c ) { return std:: isspace ( c) ; } ) )
return { } ; // empty string or string with all spaces, return an empty vector
std:: vector < std:: string > result( 1 ) ; // vector containing one empty string
std:: istringstream stm( str) ; // use a string stream to split on white-space
std:: string word ;
while ( stm >> word ) // for each word in the string
{
// if this word will fit into the current line, append the word to the current line
if ( ( result.back ( ) .size ( ) + word.size ( ) ) <= line_sz ) result.back ( ) + = word + ' ' ;
else
{
result.back ( ) .pop_back ( ) ; // remove the trailing space at the end of the current line
result.push_back ( word + ' ' ) ; // and place this new word on the next line
}
}
result.back ( ) .pop_back ( ) ; // remove the trailing space at the end of the last line
return result ;
}
int main( )
{
const std:: string str = "I need to write something that passes a value from! one program to another. "
"This is a test (with a 20 character word) - ottffssentettffssent - end test." ;
for ( auto line : split( str, 25 ) ) std:: cout << line << '\n ' ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8Y2N0eXBlPgojaW5jbHVkZSA8c3N0cmVhbT4KCi8vIGludmFyaWFudDogbGluZV9zeiA+IGxlbmd0aCBvZiBhbnkgc2luZ2xlIHdvcmQKc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNwbGl0KCBzdGQ6OnN0cmluZyBzdHIsIHN0ZDo6c2l6ZV90IGxpbmVfc3ogKQp7CiAgICBpZiggc3RkOjphbGxfb2YoIHN0ZDo6YmVnaW4oc3RyKSwgc3RkOjplbmQoc3RyKSwgW10gKCBjaGFyIGMgKSB7IHJldHVybiBzdGQ6Omlzc3BhY2UoYykgOyB9ICkgKQogICAgICAgIHJldHVybiB7fSA7IC8vIGVtcHR5IHN0cmluZyBvciBzdHJpbmcgd2l0aCBhbGwgc3BhY2VzLCByZXR1cm4gYW4gZW1wdHkgdmVjdG9yCgogICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlc3VsdCgxKSA7IC8vIHZlY3RvciBjb250YWluaW5nIG9uZSBlbXB0eSBzdHJpbmcKCiAgICBzdGQ6OmlzdHJpbmdzdHJlYW0gc3RtKHN0cikgOyAvLyB1c2UgYSBzdHJpbmcgc3RyZWFtIHRvIHNwbGl0IG9uIHdoaXRlLXNwYWNlCiAgICBzdGQ6OnN0cmluZyB3b3JkIDsKICAgIHdoaWxlKCBzdG0gPj4gd29yZCApIC8vIGZvciBlYWNoIHdvcmQgaW4gdGhlIHN0cmluZwogICAgewogICAgICAgIC8vIGlmIHRoaXMgd29yZCB3aWxsIGZpdCBpbnRvIHRoZSBjdXJyZW50IGxpbmUsIGFwcGVuZCB0aGUgd29yZCB0byB0aGUgY3VycmVudCBsaW5lCiAgICAgICAgaWYoICggcmVzdWx0LmJhY2soKS5zaXplKCkgKyB3b3JkLnNpemUoKSApIDw9IGxpbmVfc3ogKSByZXN1bHQuYmFjaygpICs9IHdvcmQgKyAnICcgOwoKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICByZXN1bHQuYmFjaygpLnBvcF9iYWNrKCkgOyAvLyByZW1vdmUgdGhlIHRyYWlsaW5nIHNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbGluZQogICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCB3b3JkICsgJyAnICkgOyAvLyBhbmQgcGxhY2UgdGhpcyBuZXcgd29yZCBvbiB0aGUgbmV4dCBsaW5lCiAgICAgICAgfQogICAgfQoKICAgIHJlc3VsdC5iYWNrKCkucG9wX2JhY2soKSA7IC8vIHJlbW92ZSB0aGUgdHJhaWxpbmcgc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgbGFzdCBsaW5lCiAgICByZXR1cm4gcmVzdWx0IDsKfQoKaW50IG1haW4oKQp7CiAgICBjb25zdCBzdGQ6OnN0cmluZyBzdHIgPSAiSSBuZWVkIHRvIHdyaXRlIHNvbWV0aGluZyB0aGF0IHBhc3NlcyBhIHZhbHVlIGZyb20hIG9uZSBwcm9ncmFtIHRvIGFub3RoZXIuICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGEgdGVzdCAod2l0aCBhIDIwIGNoYXJhY3RlciB3b3JkKSAtIG90dGZmc3NlbnRldHRmZnNzZW50IC0gZW5kIHRlc3QuIiA7CgogICAgCiAgICBmb3IoIGF1dG8gbGluZSA6IHNwbGl0KCBzdHIsIDI1ICkgKSBzdGQ6OmNvdXQgPDwgbGluZSA8PCAnXG4nIDsKfQ==
stdin
V3JpdGluZyB0aGUgcm91Z2ggZHJhZnQgaXMgYSB0cmFuc2l0aW9uLCBvbmUgdGhhdCB0YWtlcyB5b3UgZnJvbSB0aGUgbWVudGFsIGFzcGVjdCBvZiBub3RlIHRha2luZywgb3V0bGluaW5nIGFuZCBwcmV3cml0aW5nIHRvLg==
Writing the rough draft is a transition, one that takes you from the mental aspect of note taking, outlining and prewriting to.