gooポイントが当たる質問投稿キャンペーン>>

C言語の線形探索の課題なんですが

5つの整数を入力して
その入力した値からみつけたい値を探索する課題なのですが

#include <stdio.h>

/*--- 要素数nの配列aからkeyと一致する要素を線形探索 ---*/
int search(const int a[], int n, int key)
{
int i = 0;

while (1) {
if (i == n)
return (-1);/* 探索失敗 */
if (a[i] == key)
return (i);/* 探索成功 */
i++;
}
}

int main(void)
{
int i, ky, idx;
int x[4];
int nx = sizeof(x) / sizeof(x[0]);

printf("%d個の整数を入力してください。\n", nx);
for (i = 0; i < nx; i++) {
printf("x[%d]:", i);
scanf("%d", &x[i]);
}
printf("探す値:");
scanf("%d", &ky);

idx = search(x, nx, ky);/* 配列xから値がkyである要素を線形探索 */

if (idx == -1)
puts("探索に失敗しました。");
else
printf("%dは%d番目にあります。\n", ky, idx + 1);

return (0);
}


ここまではわかるのですが、
x[0]=99
x[1]=99
x[2]=88
x[3]=99
x[4]=22
と入力したときに

99は
1番目に見つかりました
2番目に見つかりました
4番目に見つかりました

と出力したいのですがうまくいきません
線形探索で同じ数値を探索するにはどうすればよいのですか?

A 回答 (3件)

#include <stdio.h>



/*--- 要素数nの配列aからkeyと一致する要素を線形探索 ---*/
int search(const int a[], int n, int key)
{
int i = 0;

while (1) {
if (i == n) return (-1); /* 探索失敗 */
if (a[i] == key) return (i); /* 探索成功 */
i++;
}
}

int main(void)
{
int i, ky, idx, t, f;
int x[5];
int nx = sizeof(x) / sizeof(x[0]);

printf("%d個の整数を入力してください。\n", nx);
for (i = 0; i < nx; i++) {
printf("x[%d]:", i);
scanf("%d", &x[i]);
}
printf("探す値:");
scanf("%d", &ky);

t = 0;
f = -1;

while (t < nx) {
idx = search(&x[t], nx - t, ky); /* 配列xから値がkyである要素を線形探索 */

if (idx != -1) {
idx += t;
printf("%dは%d番目にあります。\n", ky, idx + 1);
t = idx + 1;
f = 0;
} else
break;
}
if (f) puts("探索に失敗しました。");
return (0);
}
    • good
    • 0

#include <stdio.h>



int search(const int a[], int n, int key)
{
int i = 0;

while(1){
if (i == n) return (-1);
if (a[i] == key) return (i);
i++;
}
}

int main(void)
{
int i, ky, idx;
int x[4];
int nx = sizeof(x) / sizeof(x[0]);

printf("%d個の整数を入力してください。\n", nx);
for (i = 0; i < nx; i++){
printf("x[%d]:", i);
scanf("%d", &x[i]);
}
printf("探す値:");
scanf("%d", &ky);
for(i = 0; i < 4 && (idx = search(&x[i], nx, ky)) != -1; ){
i += idx + 1;
printf("%dは%d番目にあります。\n", ky, i);
nx -= idx + 1;
}
if (i == 0) puts("探索に失敗しました。");
return (0);
}
    • good
    • 1

#include <stdio.h>



typedef void (*callback)(int, void*);

/*--- 要素数nの配列aからkeyと一致する要素を線形探索 ---*/
void search(const int a[], int n, int key, callback cb, void* arg)
{
  int i;
  for ( i = 0; i < n; ++i ) {
   if (a[i] == key) (*cb)(i, arg);
  }
}

void found(int n, void* arg) {
  printf("%dは%d番目にあります。\n", *(int*)arg, n + 1);
}

int main() {
  int x[] = { 99,99,88,99,22 };
  int target = 99;
  search(x, 5, target, &found, &target);
  return 0;
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q線形探索(番兵法)のプログラムについて。

線形探索(番兵法)のプログラムについて考えています。

メイン関数からsearch関数に値を渡してそこで探索させるのですが、

int search(int a[], int n, int key)
{
int i = 0;

a[n] = key;

while (1) {
if (a[i] == key)
break;
i++;
}

return (i == n ? -1 : i);
}

のwhileを使ったやり方からfor文を使ったやり方に変更したいと思っています。
色々な方法でプログラムを考えてみたいので。

そうすると、なんかうまくいきません。
for文だとどのように考えたらいいのでしょうか?

Aベストアンサー

番兵法の意義からすると冗長な表現を省いた#2の方法もそう悪くはないと思いますが、ソースの見やすさを考えると、私ならwhileを使って、
while(a[i]!=key) i++;
とします。
これは、
for(;a[i]!=key;i++);
と同義ですが、whileのほうが直感的に理解しやすいかと思います(慣れれば大して変わらないですが)。
多分動作速度もあまり変わらないでしょう。
#2ぐらいの変則的な使い方ならどうということは無いですが、中にはアルゴリズムを理解するのに「解読」が必要なほど難解な表現が使われることがあります(C/C++プログラマに多いような)。
そうしたほうがソースが短くて済んだり、動作が速かったりするのですが、あまり多用するとわけのわからない代物になります。

ここの#6さんの回答とかは面白いです。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=653025

初歩のforの使い方(規定回数ループさせるだけ)で番兵法は多分無理だと思います。
どうしてもループの継続条件と検索のためのif文で計2回の比較が入りますから、逐次検索と変わらなくなってしまいます。
多分ここでつまづかれていたんでしょうけど。

番兵法の意義からすると冗長な表現を省いた#2の方法もそう悪くはないと思いますが、ソースの見やすさを考えると、私ならwhileを使って、
while(a[i]!=key) i++;
とします。
これは、
for(;a[i]!=key;i++);
と同義ですが、whileのほうが直感的に理解しやすいかと思います(慣れれば大して変わらないですが)。
多分動作速度もあまり変わらないでしょう。
#2ぐらいの変則的な使い方ならどうということは無いですが、中にはアルゴリズムを理解するのに「解読」が必要なほど難解な表現が使われることがあります(C...続きを読む

Q線形探索法のプログラムについて

配列Aに格納されている数字を検索するプログラムより、
Aのプログラムでは配列Aに格納されている数字を検索(scanf("%d" , j)で入力)した
にもかかわらず、「該当するデータがありませんでした」と表示されてしまいます。

Bのプログラムでは、配列Bに格納されている数字を検索(scanf("%d" , j)で入力)すると
「該当するデータがありました」と表示されます。

Aのプログラムで、------でかこってある部分に問題があると思われ、
いろいろと試してみましたが、未だにその理由をつかむことができません。
その理由を知りたく、書き込みを致しました。
ご教授の程宜しくお願い致します。

A.
main(){
int i , j;
int k = 0;
int A[5] = {4 , 1 , 3 , 4 , 5};

printf("検索する数値を入力してください > ");
scanf("%d" , j);
---------------------------------------------------------------
for(i=0 ; i<5 ; i++){
if(A[i] == j){
printf("該当するデータはあります");
k++;
}
}
---------------------------------------------------------------
if(k <= 0){
printf("該当するデータがありませんでした\n");
}
return;
}

B
#include<stdio.h>

main(){
int i , j , k;
int A[5] = {4 , 1 , 3 , 4 , 5};

printf("検索する数値を入力してください > ");
scanf("%d" , j);
for(i=0 ; i<5 ; i++){
if(A[i] == j){
k++;
}
}
if(k>0){
printf("該当するデータはありました");
}else{
printf("該当するデータはありませんでした");
}
return;
}

配列Aに格納されている数字を検索するプログラムより、
Aのプログラムでは配列Aに格納されている数字を検索(scanf("%d" , j)で入力)した
にもかかわらず、「該当するデータがありませんでした」と表示されてしまいます。

Bのプログラムでは、配列Bに格納されている数字を検索(scanf("%d" , j)で入力)すると
「該当するデータがありました」と表示されます。

Aのプログラムで、------でかこってある部分に問題があると思われ、
いろいろと試してみましたが、未だにその理由をつかむことができません。
...続きを読む

Aベストアンサー

scanf("%d",j)ではなく
scanf("%d",&j)です。

プログラムBに関してはkが不定

QC言語 線形探索

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXBUFFERSIZE 256

struct LinkedListNode{

int data;
struct LinkedListNode *next;
};

struct LinkedList{

int node_num;
struct LinkedListNode *head;
};


LinkedList *LinkedListMake(char *filename)
{
FILE *fp;
LinkedList *list;
char buffer[MAXBUFFERSIZE];

/* ファイル有無のチェック */
if ((fp = fopen(filename, "r")) == NULL) {
fprintf(stderr, "No Such File : %s\n", filename);
exit (1);
}

list = LinkedListAlloc();
if (list == NULL) { /* 領域確保失敗 */
exit (0); /* 終了 */
}

while (fgets(buffer, MAXBUFFERSIZE, fp)) { /* ファイル終端に到達するまでループ */
buffer[strlen(buffer) - 1] = '\0'; /* 改行文字を削除 */
LinkedListDataAdd(list, atoi(buffer));
}
fclose(fp);

return (list);
}

LinkedList *LinkedListAlloc(void)
{
LinkedList *list;

list = (LinkedList *)malloc(sizeof(LinkedList));
if (list == NULL) { /* 領域確保失敗 */
return (NULL);
}
list->node_num = 0;
list->head = NULL;
return (list);
}

LinkedListNode *LinkedListDataAdd(LinkedList *list, int x)
{
LinkedListNode *ptr; /* 注目するノードへのポインタ */
LinkedListNode *prev;
LinkedListNode *new_node;

ptr = list->head;
prev = NULL;

while (ptr) { /* 終端ノードに到達するまでループ */
if (ptr->data < x) {
prev = ptr; /* 直前ノードの更新 */
ptr = ptr->next; /* 注目ノードの更新 */
} else if (ptr->data == x) { /* x は登録済み */
return (NULL);
} else { /* x を注目ノードの直前に追加 */
new_node = LinkedListNodeAlloc();
if (new_node == NULL) { /* 領域確保失敗 */
exit (0); /* 終了 */
}
new_node->data = x;
new_node->next = ptr; /* ポインタの付け替え(注目ノードの直前) */
if (prev != NULL) { /* 連結リストの先頭以降に追加 */
prev->next = new_node; /* ポインタの付け替え */
} else { /* 連結リストの先頭に追加 */
list->head = new_node;
}
list->node_num++; /* ノード総数の更新 */
return (new_node);
}
}
/* 終端ノードに到達 */
/* x を終端に追加 */
new_node = LinkedListNodeAlloc();
if (new_node == NULL) { /* 領域確保失敗 */
exit (0); /* 終了 */
}
new_node->data = x;
new_node->next = NULL; /* new_node は新たな終端ノード */
if (prev != NULL) { /* list は少なくともひとつのノードを有している */
prev->next = new_node; /* 更新前の終端ノードの直後が new_node となる */
} else { /* list は空(ノードがひとつも含まれない) */
list->head = new_node;
}
list->node_num++; /* ノード総数の更新 */
return (new_node);
}

LinkedList *LinkedListSearch(LinkedList *list, int x)←ここがわかりません★
{

for(i = 0; i < node_num)

     ???



int main(int argc, char *argv[])
{

int a, i, x;


printf("xの値を入力");
scanf("%d", &x);


LinkedListMake(argv[1]);
LinkedListSearch(list, x);


連結リストに格納されたint型データから目的の値を線形探索するプログラムをつくってます。
連結リスト作成関数まではできたので、あと連結リストにおいて目的の値を線形探索する関数LinkedListSearchをつくればだいたい完成だと思うのですが、関数LinkedListSearchの作り方がわかりません。
引数で連結リストのポインタと目的値をとって、目的値が存在すればそのノードのポインタ、存在しない場合はNULLを返すようにするつもりです。
わかる方、是非とも教えてください!
お願いいたします。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXBUFFERSIZE 256

struct LinkedListNode{

int data;
struct LinkedListNode *next;
};

struct LinkedList{

int node_num;
struct LinkedListNode *head;
};


LinkedList *LinkedListMake(char *filename)
{
FILE *fp;
LinkedList *list;
char buffer[MAXBUFFERSIZE];

/* ファイル有無のチェック */
if ((fp = fopen(filename, "r")) == NULL) {
fprintf(stderr, "No Such File : %s\n", filename);...続きを読む

Aベストアンサー

こんな感じでどないですか?

LinkedListNode *LinkedListSearch(LinkedList *list, int x)
{
for( LinkedListNode* pNode = list->head;
pNode;
pNode = pNode->next )
{
if( pNode->data == x )
return pNode;
}

return NULL;
}

Qcharと%c , %s の関係について

char型の変数の扱いで悩んでいます。
具体的には以下の二つのプログラムの差異についてです。

----------------------
char c;

scanf("%c", &c);
printf("%c\n", c);

-----------------------
char c;

scanf("%s", &c);
printf("%s\n", &c);

-----------------------


上のプログラムは正しいと思うのですが、下のプログラムが正しいのかどうか、わかる方に教えていただきたいと思い質問させていただきました。

どちらのプログラムも問題なく動作します。
僕自身は 下のプログラムの printf 関数については間違った使い方なのではないかと思っています。

scanf("%s", &c) は入力された文字のうち、終端文字の手前までの文字を引数のポインタが示すオブジェクトへ順に格納していく関数だと理解しているので、入力された文字が一文字だった場合、&cの示すオブジェクトに文字が代入されると考えたからです。

逆に printf("%s", &c) は、&cの示すオブジェクトから”ヌル文字”の手前までの文字列を順に表示する関数だと理解しているので、問題なく動作しているのは&cで示されるオブジェクトの後ろの領域が偶然'\0'だったからではないかと考えたからです。

何かの本で、未使用の領域は0である確率が高いという記述をみたことがあり、'\0'は0と同じだということなので問題なく動作する率が高いのではないかと思っています。


僕の考え方がどの程度正しくて、正確にはどうなのかを教えて欲しいです。


ちなみに、

-----------------------
char c;
char str[100];

scanf("%s", str);
scanf("%c", &c);
------------------------

と書くと c には改行文字が代入されてしまいます。
scanf("%s", str);
において"aasssdd "と最後に空白を入れると
c には空白文字が代入されます。

しかし、
--------------------------
char str1[100];
char str2[100];

scanf("%s", str1);
scanf("%s", str2);
--------------------------
においては、
scanf("%s", str1);
で "asdfg "と最後に空白を入れても次のstr2が空白で始まることはありません。


この辺りの処理がどのような法則で実行されているのかが分かりづらくて悩んでいます。
おそらく、
scanf("%s", str);
の場合には最初の文字が空白や改行文字でも、その次に有効な文字があればそれらの改行や空白を無視するのではないかと思っています。


分かる方がいましたら回答をよろしくお願いします。

char型の変数の扱いで悩んでいます。
具体的には以下の二つのプログラムの差異についてです。

----------------------
char c;

scanf("%c", &c);
printf("%c\n", c);

-----------------------
char c;

scanf("%s", &c);
printf("%s\n", &c);

-----------------------


上のプログラムは正しいと思うのですが、下のプログラムが正しいのかどうか、わかる方に教えていただきたいと思い質問させていただきました。

どちらのプログラムも問題なく動作します。
僕自身は 下...続きを読む

Aベストアンサー

> char c;
> scanf("%s", &c);
char c では1文字分の領域しか確保されていないので、
1文字以上の文字列を無理矢理格納すると
他のデータが存在しているかもしれない領域を書き換えてしまいます。(メモリ破壊)

なお、'\0'はscanfが(本来書き込んではいけない領域に対してですが)書き込んでいます。


> と書くと c には改行文字が代入されてしまいます。
最初のscanfが改行文字を読み込んでいないからです。
以下のページに書かれている内容と本質的には同じ。
http://www9.plala.or.jp/sgwr-t/c/sec05.html#s5-

> 最初の文字が空白や改行文字でも、その次に有効な文字があればそれらの改行や空白を無視するのではないかと思っています。
そう考えて問題ないと思います。

Q線形リストに挿入するプログラム

連結リストに要素を挿入する関数 insert( ) を関数を定義して,以下の条件の下で整数型の要素を連結リストに挿入するプログラムを作成しなければならないのですが、関数insert部分が見当がつきません.
回答よろしくおねがいします。

条件
1. 関数名を insert( ) とする.
2. 連結リストの先頭ノードを指すポインタ(*head)と,リストに挿入する要素(data)を引数とする.
3. 連結リストの先頭ノードを指すポインタ(*head)からたどって,要素がリスト内で降順(大きいものから小さいものへの順)となる位置に要素を挿入する.
4. 引数で示された要素が既にリストに存在する場合には,要素の挿入は行なわない.

#include <stdio.h>
#include <stdlib.h>

typedef struct __cell {
int data;
struct __cell *next;
} CELL;

CELL *insert(CELL *head, int data);
void showList(CELL *head);

int main(void)
{
CELL *head;
head = NULL;

head = insert(head, 5);
showList(head);

head = insert(head, 2);
showList(head);

head = insert(head, 6);
showList(head);

head = insert(head, 4);
showList(head);

head = insert(head, 6);
showList(head);

head = insert(head, 4);
showList(head);

head = insert(head, 1);
showList(head);

return 0;
}

CELL *insert(CELL *head, int data)
{

/*ここで関数 insert( ) を定義します*/

}

void showList(CELL *head)
{

CELL *p;

for(p=head ; p!=NULL ; p=(*p).next)
{
printf("%d -> ", (*p).data);
}
printf("fin\n");

}

連結リストに要素を挿入する関数 insert( ) を関数を定義して,以下の条件の下で整数型の要素を連結リストに挿入するプログラムを作成しなければならないのですが、関数insert部分が見当がつきません.
回答よろしくおねがいします。

条件
1. 関数名を insert( ) とする.
2. 連結リストの先頭ノードを指すポインタ(*head)と,リストに挿入する要素(data)を引数とする.
3. 連結リストの先頭ノードを指すポインタ(*head)からたどって,要素がリスト内で降順(大きいものから小さいものへの...続きを読む

Aベストアンサー

「適切な位置を見つける」のは値の比較でしょう。
降順ソートだからp->nextがNULLもしくはp->next->data < dataになるタイミングですかね。
#余談:アロー演算子はスマートってのもあるんですがこっちの方が普及してるんで「他人が見やすい」ということもあります。

Q「木は2部グラフである。」を証明して下さい!

「木は2部グラフである。」
これを証明して欲しいのです。
出来れば背理法で。
よろしくお願いします。

Aベストアンサー

お気に召さない?
自明すぎて困っちゃうんですが、そうだな、木のノードが奇数番目と偶数番目に分けられる。つまりノードに赤と青の色を付けて、どの辺も一端が赤、他端が青のノードを繋ぐようにできる。

どれでも良いから一つノードを選んで赤にする。
これに辺1本で繋がっている全てのノードを青にする。
青のノードに辺1本で繋がっている全てのノードを赤にする。

これを繰り返せば、木は連結しているから全てのノードに色が付きます。
次に、木はループがないから、一度赤がついたノードは何度色を塗っても赤ですし、青がついたノードは青。

これなら証明っぽいですか?

Q関数から配列を返すには?

return で配列を返すにはどうしたらよいのでしょうか。
例えば以下のような場合です。

int main (){

char Value[] = "999";
int a;

 a = test(Value);

 printf ("%d", a);
 
}


int test(char *Value)
{
int nVal[255];

ここで nVal に適当な処理をして・・・

 return Value;

}


 int a を配列とかにしてみましたけど、コンパイラが
通りません。
要は配列数値を main で受け取って表示したいのですが、
本日C言語はじめたところなので、教えていただければありががたいです。

Aベストアンサー

戻り値は1つしか戻せません。
引数で配列の先頭のポインタが渡され、それを使って関数で配列の中身を
書き換えて戻ってきて、メインで配列を参照すればいいです。

参考urlの(3)を参考にしてください。

参考URL:http://www9.plala.or.jp/sgwr-t/c/sec11-3.html

Qint main()、void main()、void main(void)、int main(void)

今日、大学でC言語の講義の時間、先生が、

#include <stdio.h>

void main(void){

}

と宣言してプログラムを書くと教えていました。
main関数には、
main()
void main()
void main( void )
int main()
int main( void )

と、人によりいくつかの描き方があったりします。
どれが本当は正しいのでしょうか?
void mainはすべきではないとなんかの本で読んだのですが・・。

Aベストアンサー

通称C89という以前の言語規格(現行コンパイラの多くが準拠)では、下記のいずれかが正しい。
int main(int argc, char *argv[])
int main(void)

但し、最新のC言語規格(通称C99)では、
<ISO/IEC9899:1999>
or in some other implementation-defined manner.
</ISO/IEC9899:1999>
となっているので、処理系が戻り値のvoidを認めていればvoidも可。
# 組込み系などで戻り値を使わない環境もあるためでしょうか。

なので、コンパイラのマニュアルで戻り値のvoidにしていい/しろと書いてない限り、
voidは言語仕様的には正しくない。(でも動くものもある)

Qこのプログラムどこがおかしいですか?

コンパイルはできますが実行できません…
どこがおかしいか分かる人教えてください。
このプログラムはファイルから名前 数学の点数、英語の点数を読み込んで文字データに入れた後構造体に入れて探し出す値の項目(キー)を入力して(何番目にあるか)探し出すというプログラムです。

#include <stdio.h>
#include <string.h>
#define NUMBER 10
//構造体を宣言する
struct student
{
//名前、身長、体重を構造体オブジェクトのメンバに格納する関数の定義
char name[10];
char math[4];
char eng[4];
};


/*--- 要素数nの配列aからkeyと一致する要素を線形探索(番兵法) ---*/
int search(struct student *b, int n, char key)
{
int i=0;
b[i].name[0]=key;// 番兵を追加
while (1)
{
if (b[i].name[0] == key)
break;/* 見つけた */
i++;
}
return (i == n ? -1 : i);
}


int main(void)
{
FILE *fpin;
struct student a[NUMBER];
int i=0, idx,ret;
char buffer[20],ky;
int nx=sizeof(buffer) / sizeof(buffer[0]);

fpin=fopen("input2.txt","r"); //テキストファイルを読み取りモードで開く
while(fgets(&buffer[0],sizeof(buffer),fpin) !=NULL )
{
if(i>=100) break;//読み込む人数が100人を超えてる時の処理
ret=sscanf(&buffer[0],"%s %s %s",&a[i].name,&a[i].math,&a[i].eng); //データ文字列を3分割
if(ret!=3) //3に分割できなかったときの処理
{
puts("代入された入力項目の個数が3でありません");
goto END;
}
printf("%s %s %s\n",&a[i].name,&a[i].math,&a[i].eng);
i++;
}

printf("探す値:");
scanf("%s", &ky);

idx = search(a, nx - 1, ky);/* 配列xから値がkyである要素を線形探索 */

if (idx == -1)
puts("探索に失敗しました。");
else
printf("%dは%d番目にあります。\n", ky, idx + 1);
END:fclose(fpin);
return 0;
}

コンパイルはできますが実行できません…
どこがおかしいか分かる人教えてください。
このプログラムはファイルから名前 数学の点数、英語の点数を読み込んで文字データに入れた後構造体に入れて探し出す値の項目(キー)を入力して(何番目にあるか)探し出すというプログラムです。

#include <stdio.h>
#include <string.h>
#define NUMBER 10
//構造体を宣言する
struct student
{
//名前、身長、体重を構造体オブジェクトのメンバに格納する関数の定義
char name[10];
char math[4];
char eng...続きを読む

Aベストアンサー

>オーバーランをなくすにはどうしたらいいですか?

#define NUMBER 10

#define NUMBER 100
にする。

または、
if(i>=100) break;//読み込む人数が100人を超えてる時の処理

if(i>=NUMBER) break;//読み込む人数が100人を超えてる時の処理
にする。(この場合、コメントがウソついていますが)

ちなみに、データいっぱいまで読み込んだ場合、
このアルゴリズムでは最終データが番兵により書き換えられてしまいます。
そういう意味では、#4さんの書かれているとおりサイズ渡しているので最終まで行ったら検索を中断するようにすればよいです。

Q配列の要素数に変数を入れたいときには

よろしくお願いします。
配列の要素数には定数しか入れられないのですが,どうしても変数を入れたいときは,それを引数として関数を呼び出すしか方法はないでしょうか。
具体的には,scanfで手に入れたint型の変数を要素数とする配列を宣言したいのですが,どうすれば良いでしょうか。
ご教授ください。

Aベストアンサー

c99と呼ばれる最近の規格では、配列の大きさに変数を使用できます。
bccはc99に対応していないようです。

それ以前の規格では、動的領域確保関数 malloc や callocを使って領域を確保するか、効率等を無視してバカデカい配列を用意しておくかです。
「それを引数として関数を呼び出す」っていうのは、malloc/callocのことですか?


人気Q&Aランキング