在c ++中右对齐右边的输出

时间:2014-04-10 07:38:04

标签: c++

#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
    cout << right << "Hello" << setw(10) << "World\n";
    cout << right << "Goodbye"  << setw(10) << "World\n";
}

为什么会产生如下输出:

Hello    World
Goodbye    World

而不是:

Hello    World
Goodbye  World

我在这里做错了什么?

编辑:

#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
    cout    << "Hello"  <<  " World";
    cout << right << setw(10) << "today\n";
    cout   << "Goodbye"  <<  " World";
    cout << right << setw(10) << "today\n";
}

如果我试试这个,为什么&#34;今天&#34;部分未对齐?

3 个答案:

答案 0 :(得分:5)

更改运算符的顺序以解决此问题:

#include <iostream>
#include <iomanip>

int main()
{
    std::cout << std::left << std::setw(10) << "Hello" << "World\n";
    std::cout << std::left << std::setw(10) << "Goodbye" << "World\n";
    return 0;
}
  • 您必须将所有运算符放在之前
  • 要格式化的值。
  • 避免使用using namespace std

std::setw()运算符将字段设置为下一个值。 std::leftstd::right运算符会在此字段中设置值的位置。

这个例子

std::cout << std::left << std::setw(10) << "word1"
    << std::right << std::setw(20) << "word2" << std::endl;

会创建这种格式:

AAAAAAAAAABBBBBBBBBBBBBBBBBBBB
word1                    word2

您会看到第一个“字段”包含10个字符,其中放置第一个文本,第二个“字段”包含20个字符,其中第二个字右对齐。但是如果第一个字段中的文本比字段长,则会发生这种情况:

AAAAAAAAAA....BBBBBBBBBBBBBBBBBBBB
word1istoolong               word2

第二个字段只是改变了字符数。流永远不会跟踪当前位置,它只是使用给定大小的“字段”构建输出。

要为给定页面的文本辩护,请使用以下代码:

#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::string word;
    while (in) {
        in >> word;
        words.push_back(word);
    }
    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 (WordList::const_iterator it = words.begin(); it != words.end(); ++it) {
        if (line.size() + it->size() + 1 > pageWidth) { // next word doesn't fit into the line.
            justifyLine(line);
            line.clear();
            line = *it;
        } else {
            if (!line.empty()) {
                line.append(" ");
            }
            line.append(*it);
        }
    }
    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;
}

此示例证明每行在开始时填充给定页面。它的工作原理是将文本分成单词,用这些单词填充行,并证明每一行与宽度完全匹配。

答案 1 :(得分:4)

问题是,在您致电setw时,输出流无法记住打印"Hello""Goodbye"

尝试此操作以产生您想要的输出:

#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
    cout << left << setw(10) << "Hello" << "World\n";
    cout << left << setw(10) << "Goodbye" << "World\n";
}

答案 2 :(得分:0)

试试这个 - cout << right << "Hello" << "\t" << "World\n"; cout << right << "Goodbye" << "\t" << "World\n";