---
# System prepended metadata

title: 本番試験レベル問題２（文字列）　※メンバー共有用

---

# 本番試験レベル問題２（文字列）　※メンバー共有用

## 問題
入力として、1行目に文字列L1の大きさ、2行目に文字列L1、3行目に文字列L2の大きさ、4行目に文字列L2が与えられる。

L1の大きさ（1行目の値）がL2の大きさ（3行目の値）以上のとき、L1の中にL2がいくつ含まれているか出力せよ。また、L2の大きさがL1の大きさよりも大きいとき、L2の中にL1がいくつ含まれているか出力せよ。
ただし、文字列内の値を参照するときはポインタを使うこと。

※例えば、文字列L1の値が"future"で、それをポインタplに渡したとき、文字列の最後の文字'e'を参照する時には、*(pl+5)のように書かなくてはならない

### 入力1
```
4
abcd
2
cd
```
### 出力1
```
1
```
### 入力2
```
3
fun
9
funfanfun
```
### 出力2
```
2
```
### 入力3
```
4
ABab
2
ab
```
### 出力3
```
1
```

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

### 手順
#### １．キーボードから入力を読み込む
- 文字列L1の大きさを読み込むint型変数aを宣言
  - 文字列L1の大きさをscanfで読み取る
- 大きさaの文字列L1を読み込むchar型配列L1を宣言
  - scanfを行い、L1の値を読み取る
- 文字列L2の大きさを読み込むint型変数bを宣言
  - 文字列L2の大きさをscanfで読み取る
- 大きさbの文字列L2を読み込むchar型配列L2を宣言
  - scanfを行い、L2の値を読み取る

#### ２．a, bを適切な変数に代入する・L1, L2を適切なポインタに渡す
- int型変数lva, svaを宣言する
- char型ポインタ変数pl, psを宣言する
- 適切な変数に値を渡す
  - (b<=a)のときの処理
    - ポインタ変数plにL1を渡す
    - ポインタ変数psにL2を渡す
    - 変数lvaにaの値を渡す
    - 変数svaにbの値を渡す
  - (b<=a)以外のときの処理
    - ポインタ変数plにL2を渡す
    - ポインタ変数psにL1を渡す
    - 変数lvaにbの値を渡す
    - 変数svaにaの値を渡す

#### ３．plの中にpsがいくつ含まれているか出力する
- ポインタ変数pl内のpsの個数を渡すint型変数ansを宣言する
- ポインタ変数plを0字目から(lva-sva)字目までfor文で繰り返す
- 上記のfor文の中（二重for文）で、ポインタ変数psを0字目からsva字目までfor文で繰り返す
   - 現在参照しているplとpsの値が一致していないとき
     - 内側のfor文を終了する
   - 現在参照しているplとpsの値が一致しているとき
     - 内側のfor文を続ける
     - psの最後の文字まで一致したとき、ansを1増やす
- ansを出力する

## 解答
```
#include <stdio.h>
int main(void) {
    //文字列L1の大きさを入れる変数
    int a;
    //文字列L1の大きさを読み取る
    scanf("%d", &a);
    //文字列L1の値を入れる変数
    char L1[a];
    //文字列L1の値を読み取る
    scanf("%s", L1);
    
    //文字列L2の大きさを入れる変数
    int b;
    //文字列L2の大きさを読み取る
    scanf("%d", &b);
    //文字列L2の値を入れる変数
    char L2[b];
    //文字列L1の値を読み取る
    scanf("%s", L2);
  
    /*a,bのうち、大きい方をlva,
     小さい方をsvaに代入する*/
    int lva, sva; 
    /*L1,L2のうち、大きい方をpl,
     小さい方をpsに代入する*/
    char *pl, *ps;           
  
    if(b <= a){
        /*L1の方がL2以上のとき*/
        pl = L1;
        ps = L2;
        lva = a;
        sva = b;
    }else{
        /*L2の方が大きい時*/
        pl = L2;
        ps = L1;  
        lva = b;
        sva = a;
    }
    
    //含まれていた回数を代入する変数
    int ans = 0;            

    for (int i = 0; i < lva-sva+1; i++) {
        /*plを1字ずつ進める. lva-sva+1以降は,
          plの残りの字数がsva字よりすくなくなるため必要ない*/
        for (int j = 0; j < sva; j++) {
      　     /*psを1字ずつ進める*/
            if (*(pl+i+j) != *(ps+j)) {
            /*現在指しているplとpsの値が違うとき
              jのfor文を終了し,iのfor文に戻る*/
            break;           
        }
        if (j == sva-1) {
          /*現在指しているplの値とpsの値が最後まで同じ*/
          ans += 1;
        }
      }
    }
    
    //ansの出力
    printf("%d\n", ans);      

    return 0;
}
```
