- 番号リスト### 無限ループを終わらせたいです
2つの整数 n, k を入力する (ただし, 0<k<n, k≤5, n≤10 とする).
n 個の整数 a0, a1, …, an-1 を入力する.
以下を繰り返す.
k 個の整数 b0, b1, …, bk-1 を入力する.
ただし, 途中で EOF が入力されれば, k 個未満の整数しか入力されない.
入力された数字が k 個未満であれば, プログラムを終了する.
そうでなければ,
b0=ai, b1=ai+1, b2=ai+2, … bk-1=ai+k-1
を満たす i をすべて (スペース区切りで) 出力し, その後に改行を出力する.
という課題を行っているのですが、配列bに要素をファイルから入力するときに
無限ループしてしまい、うまくいきません。
発生している問題・エラーメッセージ
以下の入力ファイル(match-in.txt)を入力すると、最終行の3 5 2 が永遠に実行され続けます 10 3 3 5 2 4 2 4 2 3 5 2 5 2 4 2 4 2 5 2 0 3 5 2
該当のソースコード
match.c
1#include <stdio.h> 2 3#define size 512 4int compare(int, int[], int[], int, int); 5 6 7 8int main(void) 9{ 10 int i, n, k; 11 int a[size], b[size]; 12 13 fprintf(stderr, " 0<k<n, k≤5, n≤10 となる2つの整数 n, k を入力してください"); 14 scanf("%d%d", &n, &k); 15 16 fprintf(stderr, "%d個の整数を入力:", n); 17 for(i=0; i<n;i++) 18 { 19 scanf("%d", &a[i]);//文字列を受け取る場合&は不要 20 } 21 i=0; 22 for(;;) 23 { 24 25 for(i=0;i<k;i++) 26 { 27 fprintf(stderr, "%d個の整数を入力:", k); 28 if(scanf("%d", &b[i]) == EOF ){break;}//ここのbreakが動いていないと考えられます 29 30 } 31 32 33 34 for(i=0;i<n-k+1;i++) 35 { 36 if(compare(i, a, b, n, k) == 1) 37 { 38 printf("%d", i); 39 } 40 } 41 i=0; 42 printf("\n"); 43 } 44 return 0; 45} 46 47int compare(int i, int a[], int b[], int alen, int blen) 48{ 49 int k; 50 k = 0; 51 52 while( a[i] == b[k] ) 53 { 54 55 if(k == blen-1) 56 { 57 return 1; 58 } 59 k++; 60 i++; 61 } 62 63 return 0; 64}
備考
プログラムはテキストファイルに書いてcygwinでコンパイルしています gcc -Wall match.c したのち ./a < match-in.txt でファイルを入力しています
回答2件
あなたの回答
tips
プレビュー