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専用の関数なんです
」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます