2011-11-29 5 views
5

タブ文字を含む変数C++ std::stringが与えられた場合、その文字列の長さを「画面」に表示されるように決定できますか?すなわち:タブ文字を展開したstd :: stringの(印刷された)長さを調べる方法は?

std::string var = "\t\t\t"; 
std::cout << var.length();   // result: 3 
std::cout << printed_length(var); // result: 3*(# of spaces per tab) 
+0

私はこれにクロスプラットフォームの解決策はないと仮定しています。確かに。とにかくターゲットOSを指定してください。 –

+7

テキストがどこにレンダリングされているのかがわからない限り、タブの幅を知ることはできません。レンダラーはタブの幅をスペースと比較してわかります –

+0

@the_drow:現在MinGW GCC 3.4.5を使用していますWindows XPでMSYSを使用します。 –

答えて

3

容易ではありません。タブの展開が非常にばらついているので、関連する「スクリーン」(具体的には出力を駆動するソフトウェア)の具体的な知識がなければ不可能です。固定拡大と何かの倍数展開、文字セルとその他の固定測定(例えば、比例フォントなど)に基づいて、4つのかなり明白な可能性があります。 1つのタブの展開が別のタブに依存する可能性がある、さらに複雑な基準を備えた「スマートタブ」もあります。

典型的な「コンソール」では、拡張モジュールの8文字のセルになります。それに対処するには、タブを数えるだけでなく、文字列内の各タブの位置を調べる必要があります。また、タブストップに関連した文字列の先頭の位置についていくつかの仮定(またはパラメータの指定)を行う必要があります。

ボトムライン:このようなことをしたい場合は、ターゲット上でタブをどのように展開するかという知識に基づいて、自分で行う必要があります。

3

文字列内のテキストが行の唯一のテキストであること、またはタブ境界で開始するという単純な仮定を行います。

各タブ文字は、それ以前の文字数に基づいて異なる数のスペースに展開されます。

expansion_count = n_spaces - (current_count % n_spaces); 
関連する問題