# 本番試験レベル問題2 解答解説
## 解説
### 全体の流れ

### 手順
#### 1.キーボードから入力を読み込む
- 文字列L1の長さを読み込むint型変数L1_sizeを宣言
- 文字列L1の長さをscanfで読み取る
- 長さL1_sizeの文字列L1を読み込むchar型配列L1を宣言
- scanfを行い、L1の値を読み取る
- 文字列L2の長さを読み込むint型変数L2_sizeを宣言
- 文字列L2の長さをscanfで読み取る
- 長さL2_sizeの文字列L2を読み込むchar型配列L2を宣言
- scanfを行い、L2の値を読み取る
#### 2.L1の長さ, L2の長さを適切な変数に代入する・L1, L2を適切なポインタに渡す
- int型変数large_value, small_valueを宣言する
- char型ポインタ変数pointer_large, pointer_smallを宣言する
- if分を使って条件分岐を行い、適切な変数に値を渡す
- (L2_size <= L1_size)のときの処理
- ポインタ変数pointer_largeにL1を渡す
- ポインタ変数pointer_smallにL2を渡す
- 変数large_valueにL1_sizeの値を渡す
- 変数small_valueにL2_sizeの値を渡す
- (L2_size <= L1_size)以外のときの処理
- ポインタ変数pointer_largeにL2を渡す
- ポインタ変数pointer_smallにL1を渡す
- 変数large_valueにL2_sizeの値を渡す
- 変数small_valueにL1_sizeの値を渡す
#### 3.L1の中にL2がいくつ含まれているか出力する
- ポインタ変数pointer_large内のpointer_smallの個を代入するint型変数countを宣言する
- ポインタ変数pointer_largeを0字目から(large_value $-$ small_value)字目までfor文で繰り返す
- 上記のfor文の中(二重for文)で、ポインタ変数pointer_smallを0字目からsmall_value字目までfor文で繰り返す
- 現在参照しているpointer_largeとpointer_smallの値が一致していないとき
- 内側のfor文を終了する
- 現在参照しているpointer_largeとpointer_smallの値が一致しているとき
- 内側のfor文を続ける
- pointer_smallの最後の文字まで一致したとき、countを1増やす
- countを出力する
## 解答
```
#include <stdio.h>
int main(void) {
//文字列L1の長さを入れる変数
int L1_size;
//文字列L1の長さを読み取る
scanf("%d", &L1_size);
//文字列L1の値を入れる変数
char L1[L1_size];
//文字列L1の値を読み取る
scanf("%s", L1);
//文字列L2の長さを入れる変数
int L2_size;
//文字列L2の長さを読み取る
scanf("%d", &L2_size);
//文字列L2の値を入れる変数
char L2[L2_size];
//文字列L1の値を読み取る
scanf("%s", L2);
/*L1_size,L2_sizeのうち、大きい方をlarge_value,
小さい方をsmall_valueに代入する*/
int large_value, small_value;
/*L1,L2のうち、大きい方をpointer_large,
小さい方をpointer_smallに代入する*/
char *pointer_large, *pointer_small;
if(L2_size <= L1_size){
/*L1の方がL2以上のとき*/
pointer_large = L1;
pointer_small = L2;
large_value = L1_size;
small_value = L2_size;
}else{
/*L2の方が大きい時*/
pointer_large = L2;
pointer_small = L1;
large_value = L2_size;
small_value = L1_size;
}
//含まれていた回数を代入する変数
int count = 0;
for (int i = 0; i < large_value - small_value + 1; i++) {
/*pointer_largeを1字ずつ進める. large_value - small_value + 1以降は,
pointer_largeの残りの字数がsmall_value字よりすくなくなるため必要ない*/
for (int j = 0; j < small_value; j++) {
/*pointer_smallを1字ずつ進める*/
if (*(pointer_large + i + j) != *(pointer_small + j)) {
/*現在指しているpointer_largeとpointer_smallの値が違うとき
jのfor文を終了し,iのfor文に戻る*/
break;
}
if (j == small_value-1) {
/*現在指しているpointer_largeの値とpointer_smallの値が最後まで同じ*/
count += 1;
}
}
}
//countの出力
printf("%d\n", count);
return 0;
}
```