Visual Studioではstrcat関数はそのままでは使えません。ソースコードの冒頭に#pragma warning(disable: 4996)を記述するかstrcat_sをお使いください

strcat関数を使って異なる配列内に格納されている文字列データ同士を連結させてみましょう  



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


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


      

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



strlen関数だけでなく


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

     


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



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


strはstring(文字列)


catは連結 (concatenate) の略です


🌞    🌞    🌞    🌞    🌞    🌞    🌞


Visual Studioをお使いの方は


strcat_sをお使いください


もしくは

プログラムの冒頭で


#pragma warning(disable: 4996)

を記述してください



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


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


さてさて(#^.^#)


プログラムの冒頭に


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



#pragma warning(disable: 4996)

#include <stdio.h>

#include <string.h>//👈🌞ここです


int main(void){

char hairetu1[100]="nekoneko";

char hairetu2[100]="lalala";

strcat(hairetu1, hairetu2);


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

return 0;

}


Visual Studioの場合


ビルド実行結果


nekonekolalala



EAZY IDECの場合

コンパイル結果


nekonekolalala


ソーラー「


Visual Studioをお使いの方は


プログラムの冒頭で


#pragma warning(disable: 4996)


を記述するか


strcat関数の代わりにstrcat_s関数をお使いください


ここでの注目ポイントは


strcat関数をつかって


strcat(hairetu1, hairetu2);


の命令文を実行して


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


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




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




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


このとき


つなげた文字列データが格納されたメモリの先頭のアドレスが


🍎hairetu1🍎に格納されていますが



配列hairetu1に文字列データ


          "nekonekolalala"


がまるごと格納されていることになります


nekonekolalalaの14文字と文字列データであることを示す\0の1文字


合わせて


15個の文字データが


🍎hairetu1🍎に格納されることになります


ですので


hairetu1の配列宣言、初期化が実行される際


あらかじめ


char hairetu1[100]="nekoneko";


の100のように


🍎hairetu1🍎の要素数は14個以上に設定しておく必要があります


もし


今のプログラムで


char hairetu1[10]="nekoneko";


が実行されるとどういうことがおきるかというと・・・


そのプログラムはこちらです

👇

#pragma warning(disable: 4996)

#include <stdio.h>

#include <string.h>


int main(void) {

char hairetu1[10] = "nekoneko";

char hairetu2[100] = "lalala";

strcat(hairetu1, hairetu2);


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

return 0;

}


EAZY IDECの場合


nekonekolalala



Visual Studioの場合


nekonekolalala


Visual Studioの場合は実行は可能ですが


次のような警告文が表示されます


Debug Error!


Program:

C:\Users\solarplexuss\source\repos\Project33\Debug\Project33.exe

Module:

C:\Users\solarplexuss\source\repos\Project33\Debug\Project33.exe

File:


Run Time Check Failure #2 _ Stack around the vriable 'hairetu1' was corrupted.


(Press Retry to debug the application)


中止(A)  再試行(R) 無視(I)




アレサ「なぜ 


Visual Studioではこのようなビルドエラーが表示されるのですか?」


ソーラー「それは


警告文の


Run Time Check Failure #2 _ Stack around the vriable 'hairetu1' was corrupted.


にも示されていますが


hairetu1の配列宣言、初期化


char hairetu1[10] = "nekoneko";


を実行して


10個の配列変数しか生成されていない配列hairetu1に


strcat関数を使って


"nekoneko

lalala

がつなげられた


文字列データ


"nekonekolalala"


つまり


nekonekolalalaと文字列データであることを示す\0


合わせて


15個の文字列データ


を格納する場合


hairetu1の配列変数に入り切らなかった文字列データは


あふれて配列hairetu1の近くのメモリに格納されることになります


つまり


配列hairetu1の周りのメモリに格納されていたデータが上書きされてしまうというわけなんだね


そのことを


Visual Studioは警告しているというわけです」


アレサ「それで


nekonekolalalaと文字列データであることを示す\0


合わせて


15個の文字列データをhairetu1に格納するために


char hairetu1[100] = "nekoneko";


を実行して


配列変数を


100個生成していたのですね」


ソーラー「でも、もしかしたら


配列hairetu1に格納される文字数が100を超えることもあるかもしれないね


その場合もバッファオーバーフローがおこることになります


そこで


バッファオーバーフローを防ぐための


配列hairetu1に格納される文字数の数を制限する



         strcat_s関数の登場です



strcat_s関数はバッファオーバーフローを防ぐことを目的に作られた


Visual Studio専用の関数なんです





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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る