How to print “justified” text in the console using modern C++

后端 未结 1 1942
心在旅途
心在旅途 2021-01-07 00:46

How can I format text \"justified\" so it aligns to the left and right side for a given width?

int main()
{
    printJustified(\"A long text with many words.         


        
相关标签:
1条回答
  • 2021-01-07 01:37

    A simple example how to solve this problem is this:

    #include <iostream>
    #include <sstream>
    #include <list>
    
    const int pageWidth = 78;
    typedef std::list<std::string> WordList;
    
    WordList splitTextIntoWords( const std::string &text )
    {
        WordList words;
        std::istringstream in(text);
        std::copy(std::istream_iterator<std::string>(in),
                  std::istream_iterator<std::string>(),
                  std::back_inserter(words));
        return words;
    }
    
    void justifyLine( std::string line )
    {
        size_t pos = line.find_first_of(' ');
        if (pos != std::string::npos) {
            while (line.size() < pageWidth) {
                pos = line.find_first_not_of(' ', pos);
                line.insert(pos, " ");
                pos = line.find_first_of(' ', pos+1);
                if (pos == std::string::npos) {
                    pos = line.find_first_of(' ');
                }
            }
        }
        std::cout << line << std::endl;
    }
    
    void justifyText( const std::string &text )
    {
        WordList words = splitTextIntoWords(text);
    
        std::string line;
        for (const std::string& word : words) {
            if (line.size() + word.size() + 1 > pageWidth) { // next word doesn't fit into the line.
                justifyLine(line);
                line.clear();
                line = word;
            } else {
                if (!line.empty()) {
                    line.append(" ");
                }
                line.append(word);
            }
        }
        std::cout << line << std::endl;
    }
    
    int main()
    {
        justifyText("This small code sample will format a paragraph which "
            "is passed to the justify text function to fill the "
            "selected page with and insert breaks where necessary. "
            "It is working like the justify formatting in text "
            "processors.");
        return 0;
    }
    

    It works like this:

    • First the text is split into words.
    • The words are added to lines until the line can not take more words.
    • For each line, space are added between the words until the line matches the requested width.
    0 讨论(0)
提交回复
热议问题