1. ホーム
  2. c

[解決済み] ⑭と⑯は何のためにあるのですか?

2022-03-12 03:59:01

質問

私はこの単純なコードの行を期待しています

printf("foo\b\tbar\n");

を "o" と "\t" に置き換えて、次のように出力します。

fo     bar

(8文字ごとにタブストップが発生すると仮定して)。 逆に

foo    bar

私のシェルでは、♪ \b は "カーソルを1つ後ろに移動" 、♪ \t は "カーソルを次のタブストップに移動" と解釈しているようです。この動作は、私がコードを実行しているシェルに特有のものなのでしょうか?異なるシステムで異なる動作を期待すべきでしょうか?

解決方法は?

BackspaceとTabはどちらもカーソル位置の移動です。 どちらも本当の意味で「印刷可能」な文字ではありません。

あなたのコードによると

  1. print "foo"
  2. カーソルを1スペース戻す
  3. カーソルを次のタブストップに移動させる
  4. bar"を出力します。

期待する出力を得るためには printf("foo\b \tbar") . 余分な'スペース'に注意してください。 と書いてある。

  1. foo"を出力します。
  2. カーソルを1スペース戻す
  3. を出力する(これは2番目の'o'を置き換えます)。
  4. カーソルを次のタブストップに移動させる
  5. bar"を出力します。

ほとんどの場合、プログラムの出力の書式設定にタブやバックスペースを使用することは不適切です。 次のような使い方を覚えてください。 printf() 書式指定子 タブのレンダリングは、出力の表示方法によって大きく変わる可能性があります。

この小さなスクリプトは、ターミナルのタブ描画を変更する方法の一つを示します。 Ubuntu + gnome-terminalでテストしています。

#!/bin/bash
tabs -8 
echo -e "\tnormal tabstop"
for x in `seq 2 10`; do
  tabs $x
  echo -e "\ttabstop=$x"
 done

tabs -8
echo -e "\tnormal tabstop"

も参照してください。 man settermregtabs .

また、出力をリダイレクトしたり、ファイルに書き出したりすると、特にプログラミングエディターやIDEでは、タブが標準の8文字より少なく表示されることがよくあります。

つまりは

printf("%-8s%s", "foo", "bar"); /* this will ALWAYS output "foo     bar" */
printf("foo\tbar"); /* who knows how this will be rendered */

IMHOでは、一般的にタブが何かに適していることはほとんどありません。 例外は、タブで区切られた値の入力ファイルを必要とするプログラムの出力を生成することかもしれません(カンマで区切られた値と似ています)。

バックスペース '\b' テキストエディタがゴミを吐き出すだけなので、テキストファイルの作成に使ってはいけません。 しかし、フォーマット文字列だけでは実現できないような対話的なコマンドライン・プログラムを書く際には、多くの用途があります。 もし、これを頻繁に使うようであれば、"ncurses" をチェックしてください。これは、ターミナル画面のどこに出力するかをより良く制御することができます。 そして一般的に、今は1995年ではなく2011年なので、高度にインタラクティブなプログラムには通常GUIが扱いやすいのです。 しかし、やはり例外はあります。telnetサーバーや新しいスクリプト言語用のコンソールを書くような場合です。