web-dev-qa-db-ja.com

Python "{}"。formatのようなC ++文字列フォーマット

セルが適切に配置されたニーステーブル形式ですばやく簡単に印刷する方法を探しています。

python formatのような特定の長さの部分文字列の文字列を作成するためのc ++の便利な方法はありますか

"{:10}".format("some_string")
13
chrise

ここには多くのオプションがあります。たとえば、ストリームを使用します。

source.cpp

  std::ostringstream stream;
  stream << "substring";
  std::string new_string = stream.str();
3
lllShamanlll

これを試してください https://github.com/fmtlib/fmt

fmt::printf("Hello, %s!", "world"); // uses printf format string syntax
std::string s = fmt::format("{0}{1}{0}", "abra", "cad");
14
mattn

固定長の文字列を返す単純な関数をすばやく作成できます。

str文字列はnullで終了し、bufは関数を呼び出す前にすでに定義されていると考えます。

void format_string(char * str, char * buf, int size)
{
    for (int i=0; i<size; i++)
        buf[i] = ' '; // initialize the string with spaces

    int x = 0;
    while (str[x])
    {
        if (x >= size) break;
        buf[x] = str[x]; // fill up the string
    }

    buf[size-1] = 0; // termination char
}

使用されます

char buf[100];
char str[] = "Hello";
format_string(str, buf, sizeof(buf));
printf(buf);
0
Damien

上記のようにfmtを使用できない場合、フォーマットにラッパークラスを使用するのが最善の方法です。これが私が一度やったことです:

_#include <iomanip>
#include <iostream>

class format_guard {
  std::ostream& _os;
  std::ios::fmtflags _f;

public:
  format_guard(std::ostream& os = std::cout) : _os(os), _f(os.flags()) {}
  ~format_guard() { _os.flags(_f); }
};

template <typename T>
struct table_entry {
  const T& entry;
  int width;
  table_entry(const T& entry_, int width_)
      : entry(entry_), width(static_cast<int>(width_)) {}
};

template <typename T>
std::ostream& operator<<(std::ostream& os, const table_entry<T>& e) {
  format_guard fg(os);
  return os << std::setw(e.width) << std::right << e.entry; 
}
_

そして、それをstd::cout << table_entry("some_string", 10)として使用します。 _table_entry_をニーズに合わせることができます。クラステンプレート引数の控除がない場合は、テンプレートタイプの控除のために_make_table_entry_関数を実装できます。

_format_guard_の一部のフォーマットオプションは固定されているため、_std::ostream_が必要です。

0
sv90