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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

Q&A

解決済

5回答

20440閲覧

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

senbe

総合スコア27

C

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

0グッド

0クリップ

投稿2015/03/15 05:08

編集2015/03/15 06:00

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

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

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

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

lang

1#include <stdio.h> 2 3/* タブの文字の幅を調べる */ 4main() 5{ 6 printf("a\ta\n"); 7 printf("aaaaaaaaa"); 8 9 return 0; 10} 11 12/*結果 タブの幅は7文字ぶん*/ 13```これをコンパイルするとコマンドプロンプトでは 14 15 16a a 17aaaaaaaaa 18 19と表示されました。 20”\t”は7文字ぶんにあたるのですか?

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

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

いいえ。

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

例えば、"a\t*\nab\t*\nabc\t*\n01234567890"という文字列を表示すると、

lang

1a * 2ab * 3abc * 401234567890

のように、*の位置が縦にそろいます。タブはそういう風に、縦位置を揃えるための機能です。
タブがブランク何文字になるかは、そのときのカラム位置で違う。

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

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

投稿2015/03/15 08:21

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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/15 10:05

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2015/03/16 02:49

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

2015/03/16 03:42

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

2015/03/16 21:07

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

0

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

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

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

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

僕がおかしいのかな?

投稿2015/03/15 06:53

編集2015/03/15 07:06
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/03/15 07:02

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

0

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

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

投稿2015/03/15 05:33

編集2015/03/15 23:16
yuu.s

総合スコア24

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2015/03/15 05:27

編集2015/03/15 05:45
otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問