C言語の配列のコピーについて質問です

このQ&Aのポイント
  • C言語の配列のコピーについて質問です。intを要素とする二つの配列a、bとその配列の要素数を受け取り、配列aのすべての要素の値を配列bにコピーする関数を定義し、その関数の機能を確認するプログラム作成するという問題について質問です。
  • 配列aを配列bに「先頭から順番に」コピーする関数を作成する。(1)配列aを配列bに「先頭から順番に」コピーする関数を作成する。(2)配列aを配列bに「後ろから順番に」コピーする関数を作成する。
  • 配列の要素数(例では4)が変更されても処理できる関数を作成したいです。また、配列の要素の値は関数main()内で表示したいです。
回答を見る
  • ベストアンサー

C言語の配列のコピーについて質問です。

intを要素とする二つの配列a、bとその配列の要素数を受け取り、配列aのすべての要素の値を配列bにコピーする関数を定義し、その関数の機能を確認するプログラム作成するという問題について質問です。 (1)配列aを配列bに「先頭から順番に」コピーする関数を作成する (2)配列aを配列bに「後ろから順番に」コピーする関数を作成する ただし、配列の要素数(例では4)が変更されても処理できる関数を作成したいです。また、配列の要素の値は関数main()内で表示したいです。 [ヒント] (1)関数宣言の例 void array_copy(コピー元の配列, コピー先の配列, 配列の要素数) [実行結果の例] (1)先頭から順番にコピーする コピー前 a[0]: 1 b[0]: 0 a[1]: 2 b[1]: 0 a[2]: 3 b[2]: 0 a[3]: 4 b[3]: 0 コピー後 a[0]: 1 b[0]: 1 a[1]: 2 b[1]: 2 a[2]: 3 b[2]: 3 a[3]: 4 b[3]: 4 (2)後ろから順番にコピーする コピー前 a[0]: 1 b[0]: 0 a[1]: 2 b[1]: 0 a[2]: 3 b[2]: 0 a[3]: 4 b[3]: 0 コピー後 a[0]: 1 b[0]: 4 a[1]: 2 b[1]: 3 a[2]: 3 b[2]: 2 a[3]: 4 b[3]: 1 #include <stdio.h> void array_copy() から始めて int main(void) { とプログラムを作成したいのですが教えてください。

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

  • ベストアンサー
回答No.3

(1) 順向きに配列の内容をコピーする関数の処理 iを0からN-1までループさせる。ループ内で行う処理は to[i] = from[i]; である。 (2) 逆向きに配列の内容をコピーする関数の処理 iを0からN-1までループさせる。ループ内で行う処理は to[i] = from[N-(i+1)]; である。 #include <stdio.h> //順向きにコピーする関数 void array_copy(int *to , int *from , int N) { int i; //(1)を記述 } //逆向きにコピーする関数 void reverse_array_copy(int *to , int *from , int N) { int i; //(2)を記述 } //配列を0からN個分表示する関数 void view_array(int *dat , int N) { int i; for( i=0;i<N;i++ ){ printf("%d ",dat[i]); } printf("\n"); } int main(void) { int a[4] = {4,7,6,5}; int b[4] = {0,0,0,0}; view_array(a,4); //Aの表示 view_array(b,4); //Bの表示 array_copy(b,a,4); //Aの内容をBにコピーする view_array(a,4); //Aの表示 view_array(b,4); //Bの表示 reverse_array_copy(b,a,4); //Aの内容を逆向きにBへコピーする view_array(a,4); //Aの表示 view_array(b,4); //Bの表示 return 0; } 関数 array_copy だけで順向き/逆向きを切り替えたいなら 引数の数をもうひとつ増やして、順向きにしたいのか逆向きにしたいのか を判断させるような情報を付けなければできないです。

その他の回答 (3)

  • arain
  • ベストアンサー率27% (292/1049)
回答No.4

No.1です。 では、書き方を変えましょう。 関数がわからなければ、main関数の中だけでコピーの処理を作ってください。 これが出来なければ関数化は先の話です。

回答No.2

#include <stdio.h> //#define REVERSE /* 定義すると逆向きにコピー コメントアウトで順向きにコピー */ //Aの内容をBにコピーする関数 void array_copy(int *to , int *from , int N) { int i; for( i=0; i<N; i++ ){ #ifdef REVERSE /* 逆向きの場合の処理 */ to[i] = from[N-(i+1)]; //to[0]にfrom[N-(0+1)]、to[1]にfrom[N-(1+1)]、to[2]にfrom[N-(2+1)]の代入作業をto[N-1]まで行う #else /* 順向きの場合の処理 */ //単純にto[0]にfrom[0]を代入、to[1]にfrom[1]を代入をN-1まで行う #endif } } //配列を0からN個分表示する関数 void view_array(int *dat , int N) { int i; for( i=0;i<N;i++ ){ printf("%d ",dat[i]); } printf("\n"); } int main(void) { int a[4] = {4,7,6,5}; int b[4] = {0,0,0,0}; view_array(a,4); //Aの表示 view_array(b,4); //Bの表示 array_copy(b,a,4); //Aの内容をBにコピーする view_array(a,4); //Aの表示 view_array(b,4); //Bの表示 return 0; }

cutebut
質問者

補足

申し訳ありませんが#defineや#ifdefなどを用いずにプログラムすることは可能ですか? お願いします。

  • arain
  • ベストアンサー率27% (292/1049)
回答No.1

丸投げは禁止行為です。 少なくとも、「作れるだけ」は作ってみてそのソースを提示してください。 コピーの方法が分からなくても、関数の呼び出しまでくらいなら作成どきませんか?

cutebut
質問者

補足

申し訳ありません。 考えてみたのですが、for文を用いて作成するのかなぁと思う程度しか分かりません。 #include <stdio.h> void array_copy(int a[], int b[], int s) もしくは void array_copy(int *a[], int *b[], int s) を用いて関数を呼び出すのかなぁと思いました。 少しずつでもいいので教えてください。 お願いします。

関連するQ&A

  • c言語 配列

    関数の中で複数の値を配列で返したいのですが,どうすればいいでしょう? 配列を関数に渡す時にはアドレスが渡されるので,ポインタと同様関数内で値を変えればmain関数の値も変わるのではないかと思ったのですが,上手くいきません. 知りたいのは,main関数の中の配列(できれば2次元配列)の値を他の関数から値を変更する方法です.下のプログラムはためしに書いてみたものです.質問を理解するうえで役立てば幸いです. #include<stdio.h> void func(double aaa[][3] ,double bbb[]); void main(void){ double array_a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; double array_b[3]={0}; func(array_a,array_b); } void func(double aaa[][3] ,double bbb[]) { int i,j; for (i=0;i<3;i++) { for (j=0;j<3;j++) { bbb[i]=bbb[i]+aaa[i][j]; } } }

  • C言語で、他の関数で配列を書き換えられないようにしたい

    下のCのプログラムでは、func関数は配列aの先頭要素へのポインタを返します。 main関数の側では配列aの中身を表示します。 しかし、main関数のfor文の中の★の部分をコメントアウトせずに入れると、この配列の中身が書き換わってしまいます。  私はfunc関数以外では、この配列の中身をいじられたくないのです。  なんとかfunc関数を工夫して作成して、func関数以外では、配列の中身が変わらないようにしたいのですが、どうすればよいでしょうか。    とは言ったものの、多分できないだろうなあ、という気がします。  できないならばできないでも仕方ないのですが、確信が持てないのです。 条件があります。 funcでは表示は行なわない。 配列aの中身を表示できるように、funcから呼び出し元へ、aのアドレスまたはaの先頭要素のアドレスがわかるような情報を返す。 #include <stdio.h> char *func(int i) { static char a[]="AAAA"; a[i]='z'; return a; } int main(void) { int i; for(i=0; i<4; i++) { char *p=func(i); /* p[i]='X'; ★配列の中身を書き換えてしまう。 */ puts(p); } return 0; }

  • C++言語の配列の呼び方,動的・可変長の違い

    C++言語での配列の名称についての質問です. int Array[10]; みたいに宣言する普通の配列は「静的配列」と呼びますよね.コンパイル時に定数で要素数を指定しておかなければならないからですよね. これに対して,new[]演算子を用いて int *Array = new int[n]; といったように確保する配列はなんと呼ばれるのでしょうか. 実行後に変数を用いてその要素数を動的に指定できるので,「動的配列」と呼ぶ人が周りには多いです(「ポインタ配列」とも).しかし,C言語でのrealloc関数みたいに,直接に配列長を変化させるといったようなことはできませんよね. (改めてnew[]してmemcpy()すれば出来るのでしょうが) そこで,配列長をプログラム中で自在に変化させる方法としてstd::vectorを利用する方法がありますよね.このvectorを「動的配列」と呼ぶ人もいました. 私は,new[]したものは動的に要素数を指定できるがその後の配列長は固定であり,vectorはいつでも配列長が可変なので int Array[10]; ・・・静的固定長配列(静的配列) int n = 10; int *Array = new[n]; ・・・動的固定長配列 std::vector<int> v; ・・・可変長配列 と呼んでいるのですが,一般的にはそれぞれどのように呼ばれるのでしょうか. また,最近はstd::arrayをいうものを知りました.これについてもどのように呼ばれるのか,教えてください. よろしくお願いいたします.

  • 配列について(C言語)

    配列の要素において一番目の要素以外を0にするプログラムを以下のように作成したのですが(while文を*b != 0という条件で作りたい)、while文内のところが間違っているためだと思われるのですが、うまく実行されません(実行しても何も表示されない)。どのようにしたらいいのでしょうか。または、何かが抜けている、ほかの部分が間違っている等もあるためにうまく実行されないということなのでしょうか。 #include <stdio.h> int main(void) { int a[5] = {5, 78, 2, 9, 0}; int i, *b; b = &a[0]; while (*b != 0){ if(*!=a[0]) *ptr=0; else *ptr=a[0]; } for (i = 0; i < 5; i++){ printf("ptr値 =%d ptrアドレス =%p \n", *ptr, ptr); } printf("\n"); return (0); }

  • c言語

    length個のint型の要素を持つ配列A[], B[], C[]を受け取り、 A,Bの各々の各要素毎にその和(A+B)を計算して、その答えをCに代入して終了する関数 void add(int a[], int b[], int c[], int length)を定義しなさい。(以下のソースコードの空白を埋めなさい) #include<stdio.h> void diff(int A[], int B[], int C[], int length); int main(){ int a[3]={1,2,3}; int b[3]={4,5,6}; int ans[3]; diff(a, b, ans, 3); printf("answer = %d %d %d \n", ans[0], ans[1], ans[2]); } void add(int A[], int B[], int C[], int length){ } よろしくお願いします。

  • C言語の配列とポインタについて

    C言語の配列とポインタについてわからないことがあります。 以下のソース例は、10個の値の平均値を求めるプログラムです。 コメントを挟んだ部分が疑問点です。 【ソース例】 #include <stdio.h> int getaverage(int *data); int main(void) { int average,array[10] = {15,78,98,15,98,85,17,35,42,15}; average = getaverage(array); printf("%d\n",average); return 0; } int getaverage(int *data) { int i,average = 0; for (i = 0;i < 10;i++) { average += data[i]; /*ポインタ変数なのに? */ } return average / 10; } 【実行例】 49 このdata[i]はポインタ変数であり、 配列arrayの i 番目の要素であるarray[i]の"アドレス" が代入されているはずだと思うのですが、 なぜ通常の整数変数であるaverageと数値計算が出来、正しい結果が出たのでしょうか? あたかもdata[i]には、 array[i]の"アドレス"ではなく、 array[i]の"メモリの中身"が代入されているようです。 どういうことでしょうか? 回答よろしくお願いします。

  • D言語の連想配列をコピーしたい

    D言語で連想配列をコピーしたいのですが、 int[char[]] x; int[char[]] y; for(char[] a,int b;x) { y[a]=b; } などと要素を一つ一つコピーするしかないのでしょうか。 もっと効率のよいコピーはないのでしょうか。

  • C言語の簡単な質問です。

    #include "stdio.h" int tasizan(int a,int b){ int c; c=a+b; return c; } int main(void){ int a,b,c; a=1; b=1; c=tasizan(a,b); printf("%d+%d=%d",a,b,c); return 0; } と、あるとします。この文を読み込む順番を教えてください。  文の左に行番号みたいに順番を書き込んでください。   例 (例が間違ってたらすみません) 1 #include "stdio.h" 2 int main(void){ 3 int a,b,c; 4 a=1; 5 b=2; 6 c=a+b; 7 printf("%d+%d=%d",a,b,c); 8 return 0; }

  • C言語のsizeof(サイズオブ)演算子について

    はじめまして。 C言語の初学者です。 sizeof(サイズオブ)演算子の理解でつまづいています。 参考書の説明は下記の通りです。 要素数を数えるのは面倒くさいので、要素数を自動的に求めて繰り返させることにします。 要素数を求める直接的な方法は用意されていませんが、計算することは出来ます。 配列全体のサイズを求め、それを要素1つのサイズで割れば要素の数がわかります。 C言語には、変数や配列のサイズを求めるsizeof(サイズオブ)演算子があります。 sizeof演算子は、次のようにして使います。 sizeof(変数や配列名) sizeof演算子には()をつけなくても良いのですが、つけた方が読みやすいでしょう。 この演算子を使って配列arrayの要素数を求めるには次のようにします。 sizeof(array) / sizeof(array[0]) 上記の説明文にある、【配列全体のサイズ】と【要素1つのサイズ】の【サイズ】とは何を指しているのでしょうか。 また、上記の【sizeof(array) / sizeof(array[0])】の割り算の意味が分かりません。 下記のプログラムを例にして、具体的に何を何で割っているのか数字を当てはめて教えてください。 よろしくお願い致します。 #include <stdio.h> int main(void) { int array[] = {42,79,13,75,19}; int i; for (i = 0;i < sizeof(array) / sizeof(array[0]);i++) { printf("array[%d] = %d\n",i,array[i]); } return 0; } このプログラムの実行結果は次の通りになります。 array[0] = 42 array[1] = 79 array[2] = 13 array[3] = 75 array[4] = 19

  • C言語の配列のコピーについて

    C言語の配列のコピーについて int a[] = {1,2,3}; int b[3]; memcpy(b, a, sizeof(a)); は、分かるのですが、 int c[][3] = { {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12} }; int d[4][3]; memcpy(d, c, sizeof(c)); の使い方は正しいのでしょうか? 1次元配列の場合は連続するメモリ?なのでmemcpyでOKだと思うのですが 2次元以上の配列の場合は、メモリが連続しているか知らないので 不安に思いました。 実際、C言語でのメモリの取り方など詳しく書かれている本などありますか? よく初心者向け本にメモリは箱という大雑把なイメージで取り挙げられているのですが、突っ込んだ書籍等も探しています。 玄人の方、難しく(^^教えてください。

専門家に質問してみよう