# 本番試験レベル問題2(文字列) ※メンバー共有用 ## 問題 入力として、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) ### 手順 #### 1.キーボードから入力を読み込む - 文字列L1の大きさを読み込むint型変数aを宣言 - 文字列L1の大きさをscanfで読み取る - 大きさaの文字列L1を読み込むchar型配列L1を宣言 - scanfを行い、L1の値を読み取る - 文字列L2の大きさを読み込むint型変数bを宣言 - 文字列L2の大きさをscanfで読み取る - 大きさbの文字列L2を読み込むchar型配列L2を宣言 - scanfを行い、L2の値を読み取る #### 2.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の値を渡す #### 3.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; } ```