こんばんわ。
C言語はあまり明るくないんですが、興味本位で次のようなプログラムを書いてみました。
#include <stdio.h>
#include <stdlib.h>
#define MAXDATA 10000
#define KEY_NOT_FOUND EXIT_FAILURE
void read_file(int a[], char filename[]) {
FILE* fin;
int n = 0;
if ((fin = fopen(filename, "r")) == NULL) {
printf("ファイルをオープンできません\n");
exit(EXIT_FAILURE);
}
while(!feof(fin) && n < MAXDATA) {
fscanf(fin, "%d", &(a[n]));
n++;
}
fclose(fin);
}
void bubbleSort(int a[], int n) {
int i, j, k, tmp;
for (k = n - 1; k > 0; k--) {
for (i = 0; i < k; i++) {
for (j = 1; j <= k; j++) {
if (a[j] < a[j - 1]) {
tmp = a[j]; a[j] = a[j - 1]; a[j - 1] = tmp;
}
}
}
}
}
int binary_search(int ary[], int key, int imin, int imax) {
if (imax < imin) {
return KEY_NOT_FOUND;
} else {
int imid = imin + (imax - imin) / 2;
if (ary[imid] > key) {
return binary_search(ary, key, imin, imid - 1);
} else if (ary[imid] < key) {
return binary_search(ary, key, imid + 1, imax);
} else {
return imid;
}
}
}
int main(int argc, char* argv[]) {
char *endp, s[6];
int x, a[MAXDATA], position;
if (argc < 2) { return EXIT_SUCCESS; }
read_file(a, argv[1]);
bubbleSort(a, MAXDATA);
scanf("%5s%*[^\n]%*c", s);
x = strtol(s, &endp, 10);
position = binary_search(a, x, 0, 99999);
if (position == KEY_NOT_FOUND) {
printf("見つからない\n");
} else {
printf("x=%d ---> %d\n", x, position);
printf("またお会いしましょう\n");
}
return EXIT_SUCCESS;
}
ところがコンパイルして実行してみると、無限ループみたいにずーっと入力を促し続けます。
どうやら一番最初のread_file(ファイルから配列にデータを入れていく関数)の終了時点で引っかかってるらしく、延々と入力要請な状態に陥る模様です。
fscanfの記述方法が間違ってるんじゃないか、とあちこちのサイトで記述方法を調べて、書き換えてテストしてみたんですが、全く改善せず、ほとほと困り果てた状態です。
一体何が間違ってるんでしょうか。
なお、コマンドライン引数として与えるファイルはPythonで
import random
with open('hogehoge.dat', 'w', encoding = 'ascii') as f:
[print(random.randint(1, 99999), file = f) for i in range(10000)]
として作成しています。
また、利用したOSはXubuntu 20.04LTSで、コンパイラはgcc 9.3.0. とclang 10.0.0を用いてみました。