ポインタ変数aを用いてメモリに 文字列データを格納した場合ポインタ変数aをstrcpy_s関数の第1引数に設定することができる場合とできない場合があります

(´▽`*)(´▽`*)(´▽`*)(´▽`*)(´▽`*)(´▽`*)/

strcpy_s関数は統合開発環境Visual studio専用の関数となっており


他の統合開発環境ではお使いになれません


他の統合開発環境をお使いの方は


strcpy_s関数の代わりにstrcpy関数をお使いください。


またstrcpy関数はそのままでは


統合開発環境Visual studioでは使用できませんので


プログラムの冒頭で


#pragma warning(disable: 4996)を記述してください


strcpy_s関数

または

strcpy関数


を使用するには


プログラムの冒頭で


ヘッダファイル<string.h>をインクルードします


(^_-)-☆




ソーラー「さて


ふたたび


char*型のポインタ変数aを使って


文字列データ


"快晴で~す"


をメモリに格納してみます


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

👇

#include <stdio.h>

#include <string.h>


int main(void) {


char* a = "快晴で~す";


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


return 0;

}


Visual studioの場合


コンパイル結果


快晴で~す


ソーラー「このように


char*型のポインタ変数aを使って


文字列データをメモリに格納することができました


今のプログラムでは


char* a = "快晴で~す";


を実行することにより


ポインタ変数aを用いてメモリに


文字列データ


"快晴で~す"


を格納することができています」


アレサ「


char型の配列宣言


char str[100];


を実行して


配列strに


文字列データ


"快晴で~す"


を格納するのではなく


ポインタ変数aを用いて


メモリに


文字列データ


"快晴で~す"


を格納しているのですの?」


ソーラー「そうなんです


char str[100];


を実行して


配列strに


文字列データ


"快晴で~す"


を格納するのではなく


ポインタ変数aを用いて


メモリに


文字列データ


"快晴で~す"


を格納しているんです


ところで


ポインタ変数aを用いてメモリに


文字列データ


"快晴で~す"


が格納されている場合


このポインタ変数aを


strcpy_s関数の


第1引数に記述して


        strcpy_s(a,50,"さんさんとした太陽です");



を実行することにより


ポインタ変数aを用いてメモリに


文字列データ


"快晴で~す"


が格納されている状態から


ポインタ変数aを用いてメモリに


文字列データ


"さんさんとした太陽です"


が格納されている状態に変更することはできるかな~


さあ どうかな~


アレサ?」


アレサ「・・・


できそうな感じですが・・・」


ソーラー「そんな感じなんだけど


ポインタ変数aを用いてメモリに


文字列データ


"快晴で~す"



メモリに格納していたとしても


このポインタ変数aを


strcpy_s関数の


第1引数に記述して


        strcpy_s(a,50,"さんさんとした太陽です");



を実行することにより


ポインタ変数aを用いてメモリに


文字列データ


"快晴で~す"


が格納されている状態から


ポインタ変数aを用いてメモリに


文字列データ


"さんさんとした太陽です"


が格納されている状態に変更することはできないんです」



そのことを示すプログラムは次のようになります


#include <stdio.h>

#include <string.h>


int main(void) {


char* a = "快晴で~す";

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


strcpy_s(a,50, "さんさんとした太陽です");


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


return 0;

}


ビルド実行結果


快晴で~す


アレサ「??


ビルド実行結果が


快晴で~す

さんさんとした太陽です


ではなく


快晴で~す


となっています



strcpy_s(a,50, "さんさんとした太陽です");


を間に挟んで


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



2回実行されているのに


快晴で~す


しか表示されていないですの


なぜでしょうか?」


ソーラー「ふしぎですね


strcpy_s関数の第1引数に


char str[100];


を実行したときの


   😊配列strのアドレス😊を格納したポインタ変数strを


記述していればこのようなことにはならないんです


次のプログラムをご覧ください

👇

#include <stdio.h>

#include <string.h>


int main(void) {


char str[100]= "快晴で~す";


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


strcpy_s(str, 50, "さんさんとした太陽です");


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



return 0;

}


ビルド実行結果


快晴で~す

さんさんとした太陽です


(ポインタのポインタシリーズのところでも解説されますが


char* a = "快晴で~す";

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


strcpy_s(a,50, "さんさんとした太陽です");


が実行されるときの


aはchar*型のポインタ変数ですが


文字列データ"さんさんとした太陽です"


が格納されているメモリのアドレスは


char*[]型のポインタ変数に代入されています


strcpy_s関数


が実行されるには


第3引数は第1引数と


同じ型のポインタ変数


もしくは


同じ型のポインタ変数が格納しているアドレスのメモリに格納されている文字列データ


が記述されている必要があります


strcpy_s(a,50, "さんさんとした太陽です");


では


第1引数にはchar*型のポインタ変数a


第3引数にはchar*[]型のポインタ変数が格納しているアドレスのメモリに格納されている文字列データ"さんさんとした太陽です"


が記述されているので


実行することはできません


それに対し


char str[100]= "快晴で~す";


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


strcpy_s(str, 50, "さんさんとした太陽です");


が実行されるときの


strはchar*[]型のポインタ変数で


文字列データ"さんさんとした太陽です"


が格納されているメモリのアドレスは


char*[]型のポインタ変数に代入されています


strcpy_s関数


が実行されるには


第3引数は第1引数と


同じ型のポインタ変数


もしくは


同じ型のポインタ変数が格納しているアドレスのメモリに格納されている文字列データ


が記述されている必要があります


strcpy_s(str,50, "さんさんとした太陽です");


では


第1引数にはchar*[]型のポインタ変数str


第2引数にはchar*[]型のポインタ変数が格納しているアドレスのメモリに格納されている文字列データ"さんさんとした太陽です"


が記述されているので


実行することができるというわけです




詳しくはポインタのポインタシリーズのエピソードをご覧ください)



アレサ「不思議ですの」


ソーラー「じゃあ もうちょっと遊んでみようかな



char*型のポインタ変数aを使って


文字列データをメモリに格納したあと


さらに


char*型のポインタ変数bを使って


文字列データ "りんりんで~す"をメモリに格納してみます


#include <stdio.h>

#include <string.h>


int main(void) {


char* a = "快晴で~す";


char* b = "りんりんで~す";


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

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


return 0;

}


ビルド実行結果


快晴で~す

りんりんで~す



アレサ「りんりんですの・・・」


ソーラー「このとき


ポインタ変数bによってメモリに


文字列データ "りんりんで~す"


が格納されていますが


          strcpy関数を用いて


strcpy_s(a, b);


を実行することにより


ポインタ変数aによって


文字列データ "快晴で~す"


がメモリに格納された状態から


ポインタ変数aによって


(ポインタ変数bによって格納されている)


文字列データ "りんりんで~す"


がメモリに格納された状態に変更することができます



そのことを示すプログラムは次のようになります


#include <stdio.h>

#include <string.h>


int main(void) {


char* a = "快晴で~す";

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


char* b = "りんりんで~す";

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


strcpy_s(a,50, b);


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



return 0;

}


ビルド実行結果


快晴で~す

りんりんで~す



ソーラー「このとき


ポインタ変数aを使って


文字列データ

"快晴で~す"


をメモリに格納しています


文字列データ

"快晴で~す"

を格納している連続したメモリの先頭のメモリのアドレスが


ポインタ変数aに格納されています


このポインタ変数aを


strcpy_s関数の第1引数にもちいていますが


先程とは違い


ちゃんとプログラムが実行できています


ど~いう仕組みになっているのかな?」


アレサ「??」


ソーラー「もうちょっと


strcpy関数について考察してみようよ」


アレサ「はい😊 ソーラーさん」


ソーラー「今度は


strcpy_s関数の


第1引数には


生成されている配列のアドレスを格納したポインタ変数を


記述してみます


そして


strcpy_s関数の


第2引数には


文字列データ


もしくは


文字列データを格納した配列のアドレスを格納したポインタ変数


もしくは


ポインタ変数を使って文字列データを格納したときのポインタ変数


を記述してみます


この場合


strcpy_s関数を実行することはできるかな?😊」


アレサ「ソーラーさん 


今日は一段とたのしそうですね」


ソーラー「そう? そっかな?


それでは


strcpy_s関数の


第2引数に


文字列データ


もしくは


文字列データを格納した配列のアドレスを格納したポインタ変数


もしくは


ポインタ変数を使って文字列データを格納したときのポインタ変数


を記述したプログラムを実行してみたいと思います。」


#include <stdio.h>

#include <string.h>


int main(void) {


char str[100];


char ars[200] = "眩しく青い空";


char* sun = "太陽がいっぱい";


strcpy_s(str, "理想郷の夏");

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


strcpy_s(str, ars);

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


strcpy_s(str, sun);

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



return 0;

}


ビルド実行結果


理想郷の夏

眩しく青い空

太陽がいっぱい


ソーラー「このプログラムでは


まず


char str[100];


により


char型の配列


str


が生成されています


次に


char ars[200] = "眩しく青い空";


の実行により


char型の配列arsに


文字列データ


"眩しく青い空"


が格納されています


さらに


sunのポインタ変数宣言、初期化


char* sun = "太陽がいっぱい";


により


メモリに


文字列データ


"太陽がいっぱい"



格納されています


そして


strcpy_s(str, "理想郷の夏");


が実行されると


生成された配列strに


文字列データ


"理想郷の夏"


が格納されます


そのことが


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


の実行結果として


理想郷の夏


がコマンドプロンプト画面に表示されていることからもわかります


次に


strcpy_s(str, ars);


が実行されると


生成された配列strに


配列arsに格納されている


文字列データ


"眩しく青い空"



今格納している


文字列データ


"理想郷の夏"


に上書きされて


格納されます


そのことが


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


の実行結果として


眩しく青い空


がコマンドプロンプト画面に表示されていることからもわかります


アレサ「配列arsに格納されている


文字列データを


strcpy関数を使って


別の配列strに格納することもできるのですね」


ソーラー「そうだね


そして


strcpy_s(str, sun);


が実行されると


ポインタ変数sunを使ってメモリに格納された文字列データ


"太陽がいっぱい"



今、配列strが格納している


文字列データ


眩しく青い空


に上書きされて格納されます


そのことが


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


の実行結果として


コマンドプロンプト画面に


太陽がいっぱい


が表示されていることからも分かります」


アレサ「ポインタ変数sunを使って


メモリに格納された


文字列データも


strcpy関数を使って


生成されている配列strに格納することができるのですね」











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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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