質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • C

    3563questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

タブの長さは何文字ぶん?教えてください!

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,727

senbe

score 28

ボールドテキスト問題
「ブランク(空白)の列を同じスペーシングを行う最小の数のタブおよびブランク
で置き換えるプログラムentabを書け。」
に取り組んでいます。

ブランクに置き換えるために、タブは、ブランクを一文字とすると何文字ぶんにあたるのですか?

私のテキストエディタはサクラエディタで、
Windows機でコマンドプロンプトを使ってコンパイルしています。

上の質問に関してなのですが…
タブを表す"\t"がコマンドプロンプト上では何文字分で表わされるのか
調べるのに次のようなプログラムを作ってみました。

#include <stdio.h>

/* タブの文字の幅を調べる */
main()
{
     printf("a\ta\n");
   printf("aaaaaaaaa");
          
   return 0;
}

/*結果 タブの幅は7文字ぶん*/
これをコンパイルするとコマンドプロンプトでは

a           a
aaaaaaaaa

と表示されました。
”\t”は7文字ぶんにあたるのですか?
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+2

”\t”は7文字ぶんにあたるのですか?

いいえ。

タブ幅が8の時には、タブはカラム位置が(左端をゼロとして)次の8の倍数になる位置に移動します。
"a\tb"は、最初のaを表示した時点でカラム位置が 1 になりますが、1の次の8の倍数が 8 なので、カラム位置が8になるまでブランクを出力します。

例えば、"a\t*\nab\t*\nabc\t*\n01234567890"という文字列を表示すると、
a       *
ab      *
abc     *
01234567890
のように、*の位置が縦にそろいます。タブはそういう風に、縦位置を揃えるための機能です。
タブがブランク何文字になるかは、そのときのカラム位置で違う。

従って、単純には出来ない問題です。逆の方が簡単なので、まず、逆を作ってみてはどうでしょうか?
「タブをブランクに置き換えるプログラムを書け」

コマンドプロンプトでテストするなら、タブ幅は8でいいかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

タブを表す"\t"がコマンドプロンプト上では何文字分で表わされるのか 
次のようにして確認できるのでは?
$ echo -e "1234567890"
1234567890
$ echo -e "\t1"
    1         <-- コマンド画面上では 9 の位置に 1 が現れました。
まず "1234567890" をコンソールに出力します。
次に echo -e "\t1" でコンソールに TAB と 1 を出力します。
この2行の出力結果を見比べると TAB が 8 文字目までを占めていることがわかります。
(これは MaxOSX のターミナル画面の場合は 8 でした。他の OS でも多分 8 のはず。
teratail の場面上では実際の表示位置とは異なる位置で表示されてしまいましたが。)

「ブランク(空白)の列を同じスペーシングを行う最小の数のタブおよびブランク 
まずは、具体的にいくつかの例を考えてみます。
TAB が の位置が 8, 16, 24 .. と 8 倍数の場合は次のような置き換えになります。
  ブランク 0 個 => そのまま
  ブランク 1 個  => そのまま
  ブランク 2 個  => そのまま
   ...
  ブランク 7 個  => そのまま
  ブランク 8 個  => TAB 1個
  ブランク 9 個  => TAB 1個 と ブランク 1 個
  ブランク 10 個  => TAB 1個 と ブランク 2 個
   ...

一般的には
  ブランク N 個 => TAB (N / 8) 個 と ブランク (N % 8) 個
となるでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/03/16 11:49

    行頭の空白だけ処理すればいいのであれば、その通り / と % で簡単ですが、行頭だけでいいのかどうか。

    キャンセル

  • 2015/03/16 12:42

    "abc\tde"や"\tabc\tde"などの場合は、タブが現れるまでの文字数も考えなくてはなりませんね。

    キャンセル

  • 2015/03/17 06:07

    半角カナの事も考え必要もあるかもしれません。(2バイトだけど表示幅は1文字文)

    キャンセル

0

そういう機能を持つLinux標準のコマンドとして、unexpand がありますが、unexpand -t 4のようにタブ位置を指定できます。デフォルトは8です。
プログラミングの練習と言うことなら、まずは8文字固定で作ってみるのでしょうか。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

設定を変更していないのであれば半角スペース4文字分です。
しかし、ユーザー側で変更することも可能であり、以前に他のエディタなどでは
8文字や2文字とされていたことがあるので
あくまで現在のサクラエディタの仕様として、としかお答えできません。

追記:
失礼しました。テキストエディタにあわせたタブの空白数のみであり、インデント及び手法に関してではないと勘違いをしていたようです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

ボールドテキスト問題 
「ブランク(空白)の列を同じスペーシングを行う最小の数のタブおよびブランク 
で置き換えるプログラムentabを書け。」 
に取り組んでいます。 

ブランクに置き換えるために、タブは、ブランクを一文字とすると何文字ぶんにあたるのですか?


あれ?これはそういうことではなくて、タブを何文字分で定義したら、相対的インデントを崩さずにスペースの連続を、タブの連続+スペースの数を最小にして置き換えることができるか? そのタブ幅を定義するプログラムを書け、という話ではないですか?

だから、タブが一般的に何文字分か?ということは関係ないと思いますが…

僕がおかしいのかな?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/03/15 16:02

    つまり、この問題は「最大公約数を、ユークリッドの互除法等を再帰呼出し等を使って演算するプログラムを書きなさい。」という意味だと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3563questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。