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

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

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

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

Q&A

解決済

6回答

2437閲覧

c言語 任意の連続した数が、ある配列にあるかどうかを判定する方法を教えてください。

Natsuki_Ueda

総合スコア15

C

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

0グッド

1クリップ

投稿2018/09/24 05:55

c言語でプログラムを書いています。
2つの配列AとBがあります。配列AよりBのほうが要素数は多く、それぞれの配列の各要素には一桁の値が入っています。
配列Aに格納されている数が、連続して配列Bに存在するかどうかを調べる方法を教えてください。
よろしくお願いします。

例)
A[]={1, 2, 3} B[]={2, 5, 1, 2, 1, 2, 3, 8, 4}
配列Bの5つ目から7つ目にかけて、配列Aと同じ数が格納されているので、判定○

A[]={1, 2, 3} B[]={8, 4, 6, 2, 8, 9, 4, 7}
配列Aの数がどこにも連続した状態で配列Bに格納されていないので、判定×

配列A,Bの要素数は任意とします。

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

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

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

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

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

guest

回答6

0

ベストアンサー

文字列検索アルゴリズムとしてBM法があります。
有名なアルゴリズムですので探せば解説してるサイトがたくさんあります。

また亜種にBMH法やquick searchがあります。

投稿2018/09/24 08:40

asm

総合スコア15147

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

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

0

C

1#include <stdio.h> 2 3#include <string.h> 4 5#define BUFSIZE 256 6 7int main(void) 8{ 9 int a[3] = {1, 2, 3}; 10 int b[9] = {2, 5, 1, 2, 1, 2, 3, 8, 4}; 11 int i,j; 12 int pos; 13 int flag = 0; 14 int m,n; 15 m = sizeof(b) / sizeof(int); 16 n = sizeof(a) / sizeof(int); 17 for(i = 0; i <= m - n; i++){ 18 if(b[i] == a[0]){ 19 pos = i; 20 for(j = 0; j < n; j++){ 21 if(b[pos + j] == a[j]){ 22 flag = 1; 23 } 24 else{ 25 flag = 0; 26 break; 27 } 28 } 29 } 30 } 31 if(flag == 1){ 32 printf("%d番目から%d番目にかけてあるのでYES",pos,pos + n); 33 } 34 else{ 35 printf("NO"); 36 } 37 38 return 0; 39} 40

投稿2018/09/25 06:14

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

まず、要素が全一致するか判定する関数を書きます。

C

1bool is_same_array(int const *A, int const *B, size_t len) { 2 ... 3}

あとは範囲外アクセスに注意しつつループをぶん回し、
is_same_array(A, &B[i], 3)が真になるiが存在するか判定すれば良いです。

投稿2018/09/24 06:00

LouiS0616

総合スコア35660

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

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

0

どのくらいの要素数あるのかわからないので、上記の例を判別する力ずくのやり方を記載しておきます。

C

1int i=0; 2bool a; 3 4while(1) 5{ 6 if(A[0]==B[i] && A[1]==B[i+1] && A[2]==B[i+2]) 7 { 8 a=true; 9 break; 10 } 11 if(B[i+2]==NULL) 12 { 13 a=false; 14 break; 15 } 16} 17

おそらくこれでいけると思いますが、今手元に動かせる環境がないためテストしてません。

参考までに…

投稿2018/09/25 05:42

yonaja

総合スコア20

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

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

0

考え方はstrstr()と同じなので

という回答で、思わず、最後に 0 を追加すれば、そのまま、strstr()で良いんじゃないかと思ったのですが、こちらは、char の配列が対象でした。
内容には、そのままで、検索アルゴリズムそのままですね。

さて、実際の方法としては、(効率の問題はありますが)
A[0] の数字 (今回は、1)を B[]を先頭から、探します。
<-- B[]の最後まででなく、A[]の長さ分前まで。
もし、見つからなければ、 --> 無し (×)
見つかれば、その次の数字から、A[]の数字と同じが判定する。
一致すれば、 ◯
不一致ならば、次の B[]から同じ事を繰り返す。

と言ったところでしょうか。
実際のコードは考えてください。 (スマートなコードにならなかったのでとりあえず、パス)

投稿2018/09/24 07:17

pepperleaf

総合スコア6383

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

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

0

考え方はstrstr()と同じなので、strstr()の実装例を探すとか。

投稿2018/09/24 06:39

daisuke7

総合スコア1563

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問