---
# System prepended metadata

title: 本番試験レベル問題２ 解答解説

---

# 本番試験レベル問題２ 解答解説

## 解説
### 全体の流れ
![](https://i.imgur.com/MW60uGz.png)


### 手順
#### １．キーボードから入力を読み込む
- 文字列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の値を読み取る

#### ２．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の値を渡す

#### ３．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;
}
```
