質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
C

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

Cygwin

Cygwinは、Unixのような環境を、Windows上で構築させるコマンドラインインターフェースです。

Q&A

解決済

2回答

2155閲覧

c言語 for(;;)の無限ループを終わらせたいです

iisan

総合スコア5

C

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

Cygwin

Cygwinは、Unixのような環境を、Windows上で構築させるコマンドラインインターフェースです。

0グッド

0クリップ

投稿2021/09/26 09:05

  1. 番号リスト### 無限ループを終わらせたいです

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 でファイルを入力しています

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

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

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

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

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

itagagaki

2021/09/26 09:10

内側のforループは i<k の条件を満たさなくなるかまたは break文によって終了するけど、その後においても、その外側にあるforループには終了する条件もbreak文も無いので当然無限にループしますよね。
iisan

2021/09/26 10:07

返信ありがとうございます。breakの意味を正しく理解していませんでした。
guest

回答2

0

提示されているコードでは,外側の(for(;;)の)ループを抜けた後に特段やるべきことがない(return 0;しかない)ので,

if(scanf("%d", &b[i]) == EOF ){break;}//ここのbreakが動いていないと考えられます

break;return 0; としてしまっても良いですよね.

…そんな感じ(?)で,
多重ループの内側にある(:最も外側ではない)ループ内に多重ループ自体の終了判定があるような場合,
「多重ループ自体を関数に突っ込んでreturnで関数から抜ける」という形にすると楽な場合もあります.
(大抵,そのような処理は,適切な名称が付与できる作業なんじゃないかと思うし)

void SomeWork( /*引数群*/ ) { //多重ループ for( /*略*/ ) { for( /*略*/ ) { if( XXX )return; //関数から抜ける } } }

投稿2021/09/27 03:07

fana

総合スコア11996

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

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

0

ベストアンサー

for(i=0;i<k;i++)

{ fprintf(stderr, "%d個の整数を入力:", k); if(scanf("%d", &b[i]) == EOF ){break;}//ここのbreakが動いていないと考えられます }

このbreakは直前のforから抜けるだけ、ですよ

投稿2021/09/26 09:14

y_waiwai

総合スコア88042

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

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

iisan

2021/09/26 10:08

返信ありがとうございます。breakの意味を正しく理解していませんでした。breakの書く行を変え、うまく動きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問