• ベストアンサー

strcpy(&... のような記述ができるのか

現在C言語を習っている専門学校生です。 基本情報技術者を受けようと思い、以前に知り合いから貰ったアイテックの 予想問題集2005春をやっていましたが、その中に、 「単語を行末できれないように英文を出力する」という関数についての 問題がありましたが、 そこでstrcpy(&...という表現があり、ずっと勉強につかってきた「独習C 第3版」 ではこういう記述がなかったので、こういう記述は現実にあるのかどうか わからなく、ずっと悶々としておりましたが、いい加減に自己解決できそうになく、 今回投稿させていただきました。 以下がそのプログラムの一部を抜き出したものです。 #include <stdio.h> #include <string.h> #define BUFFMAX 1024 #define WORDMAX 16 void wordwrap (char str[], int max) { char word[BUFFMAX / 2][WORDMAX], buff[BUFFMAX]; int leng[BUFFMAX / 2], i, idx, cnt, pos; /*文字列を単語に分解する*/ ... /*出力する*/ ... i = pos = 0; while (i <= idx) { if ((pos + leng[i]) > max) { buff[pos - 1] = '\0'; printf("%s\n",buff); pos = 0; } strcpy(&buff[pos], word[i]);   ... } 事前にネットで「strcpy(&」で検索をしてみましたが、RSSリーダーを作るという記事(http://www.okisoft.co.jp/esc/tsu/make_rss_reader_7_003.html)でそれでも「strcpy( &(buf[i]), "月" );」などの表現はありましたが、疑問の解決には至らず、今はこの問題を作成した人が血迷っただけなのかな・・・とかしか考えていません。 どうかお時間のあるときで結構ですので、お答えいただければ幸いに思います。 どうかよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • S117
  • ベストアンサー率40% (18/45)
回答No.3

情報技術者試験は先日行われた春期から、内容が変更されています。参考書は最新のものを使う方がいいですよ。 Cにかぎらず他の言語でもそうなのですが、ある程度プログラミングの基礎を身につけたら、構文を覚えましょう。 そして、読めるようになりましょう。 この場合以下のように読みます。 まず、strcpyは引数としてchar*型とconst char*型をとります。 よって、第一引数にある式、 &buff[pos] はchar*型の式とわかります。 ここで、buffはcharの配列です。Cの「配列の識別子が式中に現れたときには、その先頭要素へのポインタになる。」という規則から、buffはbuff配列の先頭を指すchar*型の値になります。 &buff[poss] buffからposs移動した場所へのポインタを得る これは、 buff + poss buffからposs移動したポインタを得る と等価です。 いずれにせよ、buff配列の途中を指すchar*型の値が得られます。 まとめるとbuff配列の途中にword[i]の文字列を書き込むと言うことになります。 この読み方でわかると思うのですが、「strcpy(&」という構文はありません。ありもしない構文を調べても、何も手がかりは得られません。構文をしっかり覚えないと検索も役に立たなくなります。 以下、念のため「&」の説明。 演算子「&」はアドレス演算子といいます。 &o の形式で使用し、oのアドレス(oを指すポインタ)を得ます。 char a; char *p=&a; とすると、pにはaのアドレスが格納されます。 ここで&の対象は代入演算子の左に書ければ変数でなくてもいいので char *p2=&*p; と書けば、p2にはaのアドレスが格納されます。

rappa_pop
質問者

お礼

結局今回ご質問「strcpy(&」という構文がVisual C++ やBorland C++など一般的なコンパイラで規定されていて使えるかどうかをしりたかっただけでしたが、皆さん詳細なご説明をいただけて自分が勘違いしているだけだということがわかり本当に助かりました。特にS117さんには基本からきちんと解説していただきとてもよくわかりました。また、何かわからないところがでましたら質問させてもらいたいと思います。 今回は本当にありがとうございました。

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

その他の回答 (2)

  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.2

おそらく、今までは char buff[20]; strcpy(buff, "abc"); のような、strcpyの第1引数に&が付かない例だけを 見てこられたのだと思います。 strcpyの第1引数の型はchar *です。 また、配列名(上の例ではbuff)は、その配列の先頭文字へのポインタを表わします。 したがって、buff[]の先頭に"abc"を格納する、という上の例の場合、 単にbuffと書くだけでよいのです。これは、先頭文字のアドレスを &buff[0]と書いた場合と同じ意味を持ちます。つまり、 strcpy(buff, "abc"); strcpy(&buff[0], "abc"); は同じ意味です。 これで、strcpyの第1引数に&が付く意味はおわかりですね。

rappa_pop
質問者

お礼

ポインタに対しての理解が足りない状態で質問してしまったがためにご迷惑をおかけし申し訳ありません。scanf関数で引数の値を変更するときにポインタを渡す必要があるため関数内で&をつける必要があるのは覚えていましたが、strcpyも同様の理由で&をつける表現があるということは理解しておりませんでした。 本当にありがとうございます。

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

何が疑問なのかよくわかりません。 &演算子の意味はおわかりでしょうか? &buff[pos] と buff+pos が同じなのはわかりますか?

rappa_pop
質問者

お礼

お返事が遅くなりまして申し訳ありません。回答くださりありがとうございます。 私の説明が足りなく回答者の皆さんにご迷惑をおかけいたしたことをお詫びいたします。その2つが同じなのかどうかということがあまりよく分かりません。 できれば簡単でいいので、なぜアドレスを引数としてつかえるのかということを教えていただけますと幸いです。

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

関連するQ&A