• 締切済み

ポインタの文字列

例えば char buf[] = "てすと"; printf("%s", buf[2]); は問題ないですが、 char *buf = "テスト"; printf("%s", buf[2]); は間違った使い方ですか?

みんなの回答

  • jagd-doga
  • ベストアンサー率31% (14/45)
回答No.6

No.4です。 下記の件について補足します。 > ポインタについて添え字演算子[]を使うことはまったく問題ありません。 > (これはNo.3、No.4の方の勘違いでしょう) 確かにNo.5の方のおっしゃるとおり、「ポインタの添え字」はありです。 No.5さんの書き方でもそのとおりに動くのかもしれません。 (すみません。ためししてません) ただ質問者の方は、ポインタを配列で宣言していません。 配列で宣言していない変数に添え字を使うのは基本的にナシかと・・・ ●個人の書き方の問題かもしれませんが・・・

すると、全ての回答が全文表示されます。
  • kmb01
  • ベストアンサー率45% (63/138)
回答No.5

(1)char buf[] = "てすと"; (2)char *buf = "テスト"; No.4の方が言っているようにメモリ上の配置がまったく異なりますが、 bufの指す領域に書き込みを行わない限りほとんど同じ様に利用できます。 ポインタについて添え字演算子[]を使うことはまったく問題ありません。 (これはNo.3、No.4の方の勘違いでしょう) printfは何がしたいのかによってどちらが間違いかが決まります。 "スト"と表示したいのなら printf("%s",buf+2);もしくは printf("%s",&buf[2]);ですし、 "ス"と表示したいのなら printf("%c%c", buf[2],buf[3]); となります。

すると、全ての回答が全文表示されます。
  • jagd-doga
  • ベストアンサー率31% (14/45)
回答No.4

(1)char buf[] = "てすと"; (2)char *buf = "テスト"; 上記の二つの宣言ですが、プログラム的に意味がまったく違います。 (1)はメモリ上にbufというchar型の配列が少なくとも7バイト(注)確保され、その領域に"てすと"と言う値が書き込まれます。 (注)2バイト文字3つの後ろに1バイトのNULL文字が付くので、最低7バイトになります。 (2)は、まずメモリ上に静的に"テスト"という文字列と、bufというchar型の4バイト(注)のポインタが確保され、bufというポインタに"テスト"の先頭アドレスが代入されます。 (注)4バイトとなるのは32ビットマシンの場合。64ビットマシンだと8バイトになります。 ということを踏まえると、 > char buf[] = "てすと"; > printf("%s", buf[2]); bufは配列でとっているので正解です。 (ただし &buf[2] ならば、ですけど。) > char *buf = "テスト"; > printf("%s", buf[2]); bufは配列ではないので、この書き方は誤りだと思います。

すると、全ての回答が全文表示されます。
  • ryuta_mo
  • ベストアンサー率30% (109/354)
回答No.3

buf[]は配列 *bufはポインタです。 ポインタを配列のようには扱えなかったとおもいます。 もしコンパイルが通ってもほかのコンパイラで通らない可能性があるのでそういうのは避けるべきです。

すると、全ての回答が全文表示されます。
回答No.2

えー、宣言の仕方によって、buf[2]という表現が有効だったり無効だったりするか? という意味ですか? ポインタと、配列名は互換があったような気がするのですが、厳密には規格を参照する必要があるでしょう。 でも、実際この二つで扱いの違う(片方Errorを出す)コンパイラはないと思いますが・・・ もちろん、#1の方の指摘通り、”%s”で、char型はダメですが・・・

すると、全ての回答が全文表示されます。
  • gimmick
  • ベストアンサー率49% (134/270)
回答No.1

どちらも問題ありだと思います。 「すと」や「スト」を表示したいのであれば、 printf("%s", &buf[2]); または printf("%s", buf + 2); としてください。

すると、全ての回答が全文表示されます。

関連するQ&A