🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

1回答

1319閲覧

配列へt個の要素をコピーする

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

0クリップ

投稿2020/12/07 17:54

C言語、配列から配列へt個の要素をコピーするプログラムを書きたいのですが、以下までしかできませんでした。

#include <stdio.h> void ary_copy(char*d, char*s, int t); void ary_copy(char*d, char*s, int t) { int i; for(i = 0; i < t; i++) { s[i] = d[i]; } } int main(void) { int array1[100] = {0, 1, 2, 3, 4}; int array2[100]; int j; ary_copy(&array1, &array2, 100); for(j = 0; j < 5; j++) { printf("%d ", array2[j]); } }

これだとt個ではなく5個限定のコードですが、どのようにすると様々な値に対応してコードになりますか。
ご教示ください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

記載していただいてコードでは
charポインタを引数とするary_copy関数にintポインタを
代入しようとしている部分と
引数の型と変数名の間にスペースがないのでコンパイルエラーとなってしまいます。
あとプロトタイプ宣言の部分では仮引数名は必要ないので書かなくても構わないかと思われます。

diff

1#include <stdio.h> 2 3-void ary_copy(char*d, char*s, int t); 4+void ary_copy(int*, int*, int); 5 6-void ary_copy(char*d, char*s, int t) 7+void ary_copy(int*d, int*s, int t) 8{ 9 int i; 10 11 for(i = 0; i < t; i++) 12 { 13 s[i] = d[i]; 14 } 15} 16 17int main(void) 18{ 19 int array1[100] = {0, 1, 2, 3, 4}; 20 int array2[100]; 21 int j; 22 ary_copy(array1, array2, 100); 23 24 for(j = 0; j < 5; j++) 25 { 26 printf("%d ", array2[j]); 27 } 28}

これだとt個ではなく5個限定のコードですが、どのようにすると様々な値に対応したコードになりますか。

静的配列の要素数は"配列全体のバイト数/配列一つ分のバイト数"で取得できるので
今回の場合バイト数を取得するための演算子sizeofを用いて
sizeof(array1)/sizeof(array1[0])で要素数を取得できますので
上記を踏まえればC99以降(下記SaitoAtsushiさんのコメントを参照)
がコンパイルできる処理系でしかコンパイルできませんが
下記コードのように書けばよいのではないでしょうか。

c

1#include <stdio.h> 2 3void ary_copy(const int* const d, int* const s, const unsigned t) 4{ 5 for(unsigned i = 0; i < t; ++i) s[i] = d[i]; 6} 7 8int main(void) 9{ 10 int array1[] = {1, 2, 3, 4, 5}; 11 const unsigned size = sizeof(array1)/sizeof(array1[0]); 12 int array2[size]; 13 14 ary_copy(array1, array2, size); 15 16 for(unsigned j = 0; j < size; ++j) printf("%d ", array2[j]); 17 18 return 0; 19}

投稿2020/12/07 19:54

編集2020/12/08 09:47
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/12/08 07:35

ありがとうございます!素早く回答頂けて大変助かりました。修正してみます。
SaitoAtsushi

2020/12/08 08:44

ちょっとした補足というか余談みたいな感じですが、もう少し詳細です。 > 引数の型と変数名の間にスペースがないので トークンの分割はトークンを構成できる最も長い文字列とすることになっていますが、逆に言えばトークンを構成しない文字が出現した時点で次のトークンの開始であるとみなされます。 ですから、 char*d と書いてあれば char と * と d のみっつのトークンと判断されます。 間に空白は必須ではありません。 習慣的には空白は入れるものなんですが、空白の入れ方には様々なスタイルがあります。 > 配列の要素数を変数で指定できる処理系 VLA (variable-length array) と呼ばれている機能です。 C99 (ISO/IEC 9899:1999 の通称、 C の仕様の 1999 年の改定版) ではこれは必須なので C99 を名乗る処理系であれば基本的に使えると考えてよいです。 (名乗っていても完全準拠していない場合もあるんですが。) 2011 年の仕様改定ではオプショナルな仕様に格下げされてしまいました……。
退会済みユーザー

退会済みユーザー

2020/12/08 10:05 編集

確かに手元の環境で int*varと打って問題なく動いています。 引数の型と変数名の間にスペースがないのでエラーになるというのは間違った部分ですので 修正しておきます。 勉強になりました。 教えて下さりありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問