4

我试图在打印出标题后打印到一行中的统一位置。这是一个例子:

PHRASE                 TYPE
"hello there"       => greeting
"yo"                => greeting
"where are you?"    => question
"It's 3:00"         => statement
"Wow!"              => exclamation

假设每个都存储在 a 中std::map<string, string>,其中 key = 短语和 value = 类型。我的问题是,简单地使用选项卡取决于我在其中查看输出的控制台或文本编辑器。如果选项卡宽度太小,我将不确定它会在哪里打印。我尝试过使用setw,但它只打印分隔符(“=>”)距短语末尾的固定距离。有没有一种简单的方法可以做到这一点?

注意现在假设我们总是知道短语不会超过 16 个字符。如果是的话,我们不需要考虑该怎么做。

4

6 回答 6

4

使用std::leftstd::setw

std::cout << std::left; // This is "sticky", but setw is not.
std::cout << std::setw(16) << phrase << " => " << type << "\n";

例如:

#include <iostream>
#include <string>
#include <iomanip>
#include <map>

int main()
{
    std::map<std::string, std::string> m;
    m["hello there"]    = "greeting";
    m["where are you?"] = "question";

    std::cout << std::left;

    for (std::map<std::string, std::string>::iterator i = m.begin();
         i != m.end();
         i++)
    {
        std::cout << std::setw(16)
                  << std::string("\"" + i->first + "\"")
                  << " => "
                  << i->second
                  << "\n";
    }
    return 0;
}

输出:

“你好” => 问候
“你在哪?” => 问题

有关演示,请参见http://ideone.com/JTv6na

于 2013-01-07T14:55:49.907 回答
3
printf("\"%s\"%*c => %s", 
    it->first.c_str(), 
    std::max(0, 16 - it->first.size()),
    ' ',
    it->second.c_str());`

与彼得的解决方案相同的想法,但将填充放在引号之外。它使用%c长度参数来插入填充。

于 2013-01-07T15:03:08.133 回答
1

如果您不反对 C 风格的打印,那么printf它非常适合这种事情,并且更具可读性:

printf("\"%16s\" => %s\n", it->first.c_str(), it->second.c_str());

在 C++ 程序中使用 printf 和朋友没有任何问题,只是要小心混合 iostreams 和 stdio。您始终可以将 sprintf 放入缓冲区,然后使用 iostreams 将其输出。

于 2013-01-07T14:56:05.070 回答
1

您可能会发现此功能很有用:

#include <iostream>
#include <iomanip>

void printRightPadded(std::ostream &stream,const std::string &s,size_t width)
{
  std::ios::fmtflags old_flags = stream.setf(std::ios::left);
  stream << std::setw(width) << s;
  stream.flags(old_flags);
}

你可以像这样使用它:

void
  printKeyAndValue(
    std::ostream &stream,
    const std::string &key,
    const std::string &value
  )
{
  printRightPadded(stream,"\"" + key + "\"",18);
  stream << " => " << value << "\n";
}
于 2013-01-07T15:13:48.297 回答
0

if you can't work out with setw, a simple alternative to try is to patch all phrase with spaces so that they are all 16 characters long.

于 2013-01-07T14:53:33.413 回答
0

我个人发现 C 风格的打印对于格式化打印更具可读性。使用您还可以使用格式化程序printf处理列宽。*

#include <cstdio>

int main() {
    printf("%-*s%-*s\n", 10, "Hello", 10, "World");
    printf("%-*s%-*s\n", 15, "Hello", 15, "World");  

    // in the above, '-' left aligns the field
    // '*' denotes that the field width is a parameter specified later
    // ensure that the width is specified before what it is used to print  
}

输出

Hello     World     
Hello          World          
于 2013-01-07T15:06:07.967 回答