打印到c ++中在线的特定位置输出

时间:2013-01-07 14:45:06

标签: c++ string printing

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

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

假设每个都存储在std::map<string, string>中,其中key = phrase和value = type。我的问题是简单地使用制表符取决于我查看输出的控制台或文本编辑器。如果制表符宽度太小,我将无法确定它将在何处打印。我尝试过使用setw,但只打印了与词组末尾相距固定距离的分隔符(“=&gt;”)。有一种简单的方法可以做到这一点吗?

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

6 个答案:

答案 0 :(得分:3)

使用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;
}

输出:

"hello there"    => greeting
"where are you?" => question

请参阅http://ideone.com/JTv6na了解演示。

答案 1 :(得分:3)

printf("\"%s\"%*c => %s", 
    it->first.c_str(), 
    std::max(0, 16 - it->first.size()),
    ' ',
    it->second.c_str());`

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

答案 2 :(得分:1)

如果你不喜欢C风格的打印,printf非常适合这类事情,并且更具可读性:

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

在C ++程序中使用printf和朋友没什么不对,只要小心混合iostreams和stdio。你总是可以sprintf到缓冲区,然后用iostreams输出。

答案 3 :(得分: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";
}

答案 4 :(得分:0)

如果你无法使用setw,一个简单的替代方法是用空格修补所有短语,这样它们都是16个字符长。

答案 5 :(得分: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