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