4

ヘッダーを印刷した後、行の均一な位置に印刷しようとしています。次に例を示します。

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ましたが、フレーズの終わりから一定の距離だけ区切り文字( "=>")が出力されます。これを行う簡単な方法はありますか?

今のところ、フレーズがたとえば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());`

Peterのソリューションと同じアイデアですが、引用符の外側にパディングを配置します。%c長さ引数とともに使用して、パディングを挿入します。

于 2013-01-07T15:03:08.133 に答える
1

Cスタイルの印刷に不利でない場合はprintf、この種の印刷に最適で、はるかに読みやすくなります。

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

C ++プログラムでprintfとその仲間を使用することに何の問題もありません。ただ、iostreamと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

個人的には、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 に答える
0

setwを使用できない場合は、すべてのフレーズにスペースをパッチして、すべて16文字になるようにするのが簡単です。

于 2013-01-07T14:53:33.413 に答える