strcat関数を使って異なる配列内に格納されている文字列同士を連結させてみましょう  さらにfor文を使って文字列を繰り返し連続接続してみます

ソーラー「せっかくヘッダファイル<string.h>を読み込んだのだから


ヘッダファイル<string.h>に格納されている



      

     配列に格納されている文字列の文字を数え上げる



strlen関数だけでなく



同じくヘッダファイル<string.h>に格納されている


       


異なる配列内に格納されている文字列同士を連結させる機能を持つ



strcat関数もつかってみようよ。


(このヘッダファイル<string.h>の例を見てもわかるように


ヘッダファイルには一つの関数だけが格納されているわけではありません。)


さてさて(#^.^#)


プログラムの冒頭に


#include <string.h>をかきこんで


#include <stdio.h>

#include <string.h>


int main(void){

char hairetu1[]="nekoneko";

char hairetu2[]="lalala";

strcat(hairetu1, hairetu2);


printf("%s\n",hairetu1);

return 0;

}

コンパイル結果


nekonekolalala


ここでの注目ポイントは


strcat関数をつかって


strcat(hairetu1, hairetu2);


の命令文を実行して


配列hairetu1と配列hairetu2内の文字列をつなげたあとに


そのつなげたものを printf出力表示するのに




        printf("%s\n",hairetu1);と




🍎hairetu1🍎を指定しているところかな。


さて

配列hairetu1内に格納された文字列nekonekoと

配列hairetu2内に格納された文字列lalalaをつなげて


nekonekolalalaと1つの文字列をつくった。よかった。


printf表示するときにはhairetu1だけでいい・・・となると?」


アレサ

「配列hairetu1内の文字列nekonekoと配列hairetu2内の文字列lalalaを


strcat関数をもちいてつなげたあと


配列hairetu2には何がはいっているのですか?・・・となるなる」


ソーラー「そう!


そこで配列hairetu1と配列hairetu2内の文字列をつなげたあとの


配列hairetu2内の中身に何がはいってるかを


printf出力表示するプログラムを構成してコンパイルしてみます。


#include <stdio.h>

#include <string.h>


int main(void){

char hairetu1[]="nekoneko";

char hairetu2[]="lalala";


strcat(hairetu1, hairetu2);/*配列1と配列2をつなげる*/


printf("%s\n",hairetu2);/*その後、配列2内に何が格納されているかをprintf表示する*/

return 0;

}


コンパイル結果


lalala


ソーラー「なんかいいかも


配列hairetu1と配列hairetu2内の文字列をつなげても


配列hairetu2には元から入っていた文字列が残ってるってことか・・


変化したのは


配列hairetu1だけなんだね。


では


strcat(hairetu1, hairetu2);によって


配列「hairetu1」に格納されている文字列がnekonekolalalaになったのなら


その配列「hairetu1」にhairetu2をつなげてみるとどうなるかな?


アレサ「そうですね・・できそうです・・


#include <stdio.h>

#include <string.h>


int main(void){

char hairetu1[]="nekoneko";

char hairetu2[]="lalala";

strcat(hairetu1, hairetu2);

/*まず

配列hairetu1内の文字列nekonekoと配列hairetu2内の文字列lalalaをつなげます。

その結果 配列hairetu1内の文字列はnekonekolalalaになります*/


strcat(hairetu1, hairetu2);


/*ここで配列hairetu1内の文字列nekonekolalalaに

さらに配列hairetu2内の文字列lalalaをつなげます*/


printf("%s\n",hairetu1);

return 0;

}


コンパイル結果


nekonekolalalalalala



予想通りです」


ソーラー 「やったね,アレサ、上々の出来


ならば次はfor文を使い


nekonekoにlalalaを10回つなげてみる。


#include <stdio.h>

#include <string.h>


int main(void){

char hairetu1[]="nekoneko";

char hairetu2[]="lalala";


int a;

for(a=1;a<11;a++)strcat(hairetu1, hairetu2);


/*この命令文

配列hairetu1内の文字列nekonekoに

配列hairetu2内の文字列lalalaを10回つなげます。


lalala~lalala~


猫🐈🐈🐈の喜びを表現しようとしています*/


printf("%s\n",hairetu1);

return 0;

}


このプログラムを

エディタにうちこんでいって・・・・・・


おや、🐈🐈🐈の絵文字をうちこんだら文字化けすると思ったら・・・??


🐈の絵文字が かろうじて表現されてる???

👆ここが個人的には重要なポイントです by ソーラー


かわい~い~な この🐈の絵文字


それではプログラムをコンパイルっ」



コンパイル結果


nekonekolalalalalalalalalalalalalalalalalalalalalalalalalalalalalala



ソーラー「これもコンパイル成功。


ではでは無限にlalalaを


nekonekoにつなげてみることは~~できるのかな~~


for文の条件式を

for(a=1;a<11;a++)から無限仕様の

for(;;)に変化させ

無限にlalalaをnekonekoにつなげるプログラムを作製してみると



#include <stdio.h>

#include <string.h>


int main(void){

char hairetu1[]="nekoneko";

char hairetu2[]="lalala";


for(;;)strcat(hairetu1, hairetu2);


/*この命令文で配列hairetu1内の文字列nekonekoに


配列hairetu2内の文字列lalalaを無限につなげようとしています。


猫🐈🐈🐈の無限の喜びを表現しようとしています*/


printf("%s\n",hairetu1);

return 0;

}


ソーラー 「このプログラムをコンパイルしてみると・・・」



コンパイル結果


_



ソーラー「コンパイル結果は _ アンダーバーのみ・・・」


アレサ「もしかすると


配列hairetu1内の文字列nekonekoに


配列hairetu2内の文字列lalalaを無限に繋げ続ける・・・


配列hairetu1内に無限に文字列lalalaを格納する・・・ということは


つまり


命令文for(;;)strcat(hairetu1, hairetu2);


は無限に実行されることになり


命令文printf("%s\n",hairetu1);


の実行までには辿り着かないのではないでしょうか?


ですので


コンパイル結果に


 プログラムの実行中を示す


 _


アンダーバーがコマンドプロンプト画面に表示されているのでは


ないですか ソーラーさん?」


ソーラー「あっそうかも」

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます