在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";
}

如果我尝试这个,为什么“今天”部分错位了?

原文由 user3340001 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 432
1 个回答

改变运算符的顺序来解决这个问题:

 #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;
}

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

原文由 Flovdis 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏