strcpy_s関数とstrcpy関数の違いはなんでしょうか?
ソーラー「そこで
strcpy_s関数とstrcpy関数の違いはなにかということなります
strcpy_s関数はセキュリティ機能を強化した関数で
strcpy_s(str,12, ars);
のように
第2引数をもつことができます。
strcpy_s(str,12, ars);
は
配列strに配列arsに格納されている文字列データを
格納する働きがあります
ここで
第2引数の12は12バイトを意味しており
配列strに書き込まれる文字列データの数を
12バイトまでと制限しています
#include <stdio.h>
#include <string.h>
int main(void) {
char str[100];
char ars[100];
char arr[100];
strcpy_s(str, "luckyで~す");
strcpy_s(ars, "mappyで~す");
strcpy_s(arr, "benriで~す");
strcpy_s(str,12, ars);
/*配列strに書き込まれる文字列データの数を12バイトまでと制限しています*/
printf("%s\n", str);
printf("%s\n", ars);
printf("%s\n", arr);
return 0;
}
ビルド結果
mappyで~す
mappyで~す
benriで~す
ソーラー「配列arsに格納されている文字列データは
"mappyで~す"
は
文字列データ"mappyで~す"が
文字列データであることを示す\0(ナル文字)を含めて
12バイトのデータ量があります。
半角英数字
m,a,p,p,yはそれぞれ1バイト
全角文字
で~す
はそれぞれ2バイト
\0(ナル文字)は1バイトの
データ量を持っていて合計12バイトのデータ量というわけです
strcpy_s(str,12, ars);
により
配列strには12バイトまでの文字列データを書き込むことができるので
12バイトのデータ量をもつ
文字列データ
"mappyで~す"
は
無事に
配列strに書き込まれています。
ここで
strcpy_s(str,2, ars);
と
配列strに書き込むことのできる
文字列データを2バイトに制限したとすると
ビルド結果はどうなるかな?
新たな次のプログラムを実行してみよう。
#include <stdio.h>
#include <string.h>
int main(void) {
char str[100];
char ars[100];
char arr[100];
strcpy_s(str, "luckyで~す");
strcpy_s(ars, "mappyで~す");
strcpy_s(arr, "benriで~す");
printf("実行されるのはこの命令文までです\n");
strcpy_s(str, 2, ars);
/*配列strに書き込まれる文字列データの数を2バイトまでと制限しています*/
printf("%s\n", str);
printf("%s\n", ars);
printf("%s\n", arr);
return 0;
}
ビルド実行結果(Visual Studioの場合)
Debug Assertion Failed!
Program:
C:\Users\solarplexuss\source\repos\Project8\Debug\Project8.exe
File:minkerne|\crts\ucrt\inc\corecrt_interanal_string_templates.h
Line:81
Expression:(L"Buffer is too small"&&0)
For information on how your program can cause an assertion failure,see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
中止 再試行 無視
と表示されます。
ここで
中止 無視のいずれかを選んでも
実行されるのはこの命令文までです
が
コマンドプロンプト画面に表示されます。
つまり
strcpy_s(str, 2, ars);
の前の命令文
printf("実行されるのはこの命令文までです\n");
までしか
プログラムが実行されないのです
strcpy_s(str, 2, ars);
では
配列strに書き込むことのできる文字列データは2バイトまでと制限されているので
今のプログラムのように
配列arsに格納されている文字列データ
"mappyで~す"(12バイト)を
配列strに格納しようとすると
strcpy_s(str, 2, ars);
は実行されず
それ以降の
プログラムの実行がされないよう設計されています。」
アレサ「なぜこのようなことがおこるのですか?(*^_^*)/」
ソーラー「よくぞ きいてくれました
娘や・・・
それをまっていました
ここまでひっぱったかいがあるというものだね・・・
それは😊
strcpy関数では
strcpy(str, ars);
のように
配列strに入力できる文字列データを制限できません。
もしも
char str[100];
char ars[100];
char arr[100];
でなく
char str[100];
char ars[200];
char arr[300];
と配列宣言がされていて
配列arsに150バイトのデータ量をもつ文字列データが格納されていた場合
strcpy(str, ars);
が実行されると
100バイトしかデータ格納容量のない配列strに
150バイトのデータ量をもつ文字列データが格納されることになります。
配列strは100バイトしかデータ格納容量がないので
配列strで格納できない残り50バイトのデータは
別のメモリにあふれて格納されることになります。
つまり
配列strの周りのメモリに格納されているデータが
書き換えられてしまうというわけです
もしも重要なデータだったらまずいよね。
そこで
strcpy関数を改良した
strcpy_s関数が考案され
配列strに書き込まれる文字列データを制限できるようにし
制限を超える文字列データが
配列strに格納されようとすると
strcpy_s関数の命令文の実行を止めて
配列strの周りのメモリに格納されているデータが
書き換えられてしまわないようにしたというわけです。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます