天国にいけるC言語入門 ヘキサ構造体 ver3.2128
構造体のメンバ配列宣言を行い、構造体変数のメンバ配列に😊strcpy関数😊を用いて文字列データを格納しコマンドプロンプト画面に文字列をprintf出力表示してみよう
構造体のメンバ配列宣言を行い、構造体変数のメンバ配列に😊strcpy関数😊を用いて文字列データを格納しコマンドプロンプト画面に文字列をprintf出力表示してみよう
ソーラー「おおっと忘れてた(^_^)/
構造体のメンバ配列宣言を設定し
構造体変数宣言を実行したときに生成される
構造体変数のメンバ配列に
文字列データを格納し
文字列データをコマンドプロンプト画面にprintf出力表示してみよう。」
solarplexuss「???」
まずは次のプログラムをご覧ください
👇
#include <stdio.h>
#include <string.h>
typedef struct Cube
{
char str[100];//配列宣言が記述されています
int no;
float tate;
float yoko;
float takasa;
} Cube;
int main(void) {
Cube cube1;
strcpy_s(cube1.str,"りっぽ~たーい、その1");//ここがポイントです
cube1.no = 1;
cube1.tate = 4.0;
cube1.yoko = 5.0;
cube1.takasa = 6.0;
printf("%s\n", cube1.str);
printf("%d\n", cube1.no);
printf("%f\n", cube1.tate);
printf("%f\n", cube1.yoko);
printf("%f\n", cube1.takasa);
return 0;
}
コンパイル結果
りっぽ~たい、その1
1
4.000000
5.000000
6.000000
ソーラー
「このプログラムでは
再び
strcpy_s関数
が登場します。
まず文字列データ"りっぽ~たーい、その1"を
格納するために
char型の配列strの構造体Cube型のメンバ配列宣言
char str[100];
を
Cubeの構造体宣言内に記述します
以下のようにですね」
👇
typedef struct Cube
{
char str[100];//👈こっこ
int no;
float tate;
float yoko;
float takasa;
} Cube;
ソーラー「
char str[100]
は
構造体Cube型のメンバ配列とよばれます
構造体Cubeのメンバ配列宣言
を
char str[100];
と記述することにより
char型の配列
char str[100]
を
構造体Cubeのメンバ配列にしています
このとき
半角英数字99文字と文字列であることを表すためのナル文字\0合わせて半角英数字100文字分のデータを
cube1の構造体変数宣言
Cube cube1;
を実行したとき
生成される
(*´▽`*)構造体変数cube1のメンバ配列(*´▽`*)
(*´▽`*)cube1.str(´▽`*)
に格納することができます」
ここでお話がすこし変わりますが
🌞🌞🌞1度作製した配列に🌞🌞🌞
文字列を代入するには
🌞🌞🌞strcpy_s関数🌞🌞🌞
をもちいる必要があります
通常
char型の配列宣言
char str[100];
を実行し
一度生成された
char型の配列
str{100]には
新たに
str[100]="りっぽ~たーい、その1";
のように
直接
文字列データを代入することはできないのです
配列の基本的な性質なのです
solarplexussより
ソーラー「
str[100]="りっぽ~たーい、その1";
は
違和感があるね」
アレサ「はい そうなのですの(´▽`*)
char str[100];
str[100]="りっぽ~たーい、その1";
の命令文を実行し文字列データ"りっぽ~たーい、その1"
を
配列strに代入することはできないのです
char str[100];
str="りっぽ~たーい、その1";
も実行することはできません
同様に
cube1の構造体変数宣言
Cube cube1;
が実行されると
構造体変数cube1のメンバ配列となる
cube1.str
が生成されますが
一度生成された
Cube型の構造体変数cube1のメンバ配列
cube1.strにも
cube1.str="りっぽ~たーい、その1";
のように
直接
文字列データを代入することはできないのです
Cube cube1;
cube1.str="りっぽ~たーい、その1";
は
実行できないのです
Cube cube1;
cube1.str="りっぽ~たーい、その1";
は
char str[100];
str="りっぽ~たーい、その1";
と同じことを実行しているに相当するというわけですの」
ソーラー「あっ なあ~るほどぉ
そういう仕組みになっているんだね😊」
アレサ「cube1の構造体変数宣言
Cube cube1;
を実行し
生成される
構造体変数cube1のメンバ配列となる
cube1.strには
cube1.str="りっぽ~たーい、その1";
のように文字列データ"りっぽ~たーい、その1"
を格納することはできないので
😊strcpy_s関数を用いて😊
strcpy_s(cube1.str,"りっぽ~たーい、その1");
を実行し
構造体変数cube1のメンバ配列となる
cube1.strに
文字列データ"りっぽ~たーい、その1"
を代入することになります
このとき
strcpy_s(cube1.str,"りっぽ~たーい、その1");
内で用いられている
cube1.str
は
構造体変数cube1のメンバ配列
cube1.str
の(先頭の配列変数cube1.str[0]の)アドレスを格納している
💖ポインタ変数💖となります」
ソーラー「そういえば
strcpy_s関数は文字列データを配列に
代入することができる関数だったね」
ここで
いま一度 再確認です
strcpy_s関数は統合開発環境Visual studio専用の関数となっており
他の統合開発環境ではお使いになれません
他の統合開発環境をお使いの方は
strcpy_s関数の代わりにstrcpy関数をお使いください。
またstrcpy関数はそのままでは
統合開発環境Visual studioでは使用できませんので
プログラムの冒頭で
#pragma warning(disable: 4996)を記述してください
strcpy_s関数
または
strcpy関数
を使用するには
プログラムの冒頭で
ヘッダファイル<string.h>をインクルードします
再確認終了です(´▽`*)
アレサ「
strcpy_s(cube1.str,"りっぽ~たーい、その1");
を実行すると
構造体変数cube1のメンバ配列
cube1.strに文字列データ
"りっぽ~たーい、その1"
が
格納されます
そののち
printf("%s\n", cube1.str);
をおこなうことにより
構造体変数cube1のメンバ配列
cube1.strに格納されている文字列データ
"りっぽ~たーい、その1"
が
%s出力変換指定子を通して
りっぽ~たーい、その1
として
コマンドプロンプト画面に表示されます。」
ソーラー「アレサ もう1ど
今のお話をくりかえしてみよう
」
アレサ「はい ソーラーさん
今のプログラムの
👇
#include <stdio.h>
#include <string.h>
typedef struct Cube
{
char str[100];
int no;
float tate;
float yoko;
float takasa;
} Cube;
int main(void) {
Cube cube1;
strcpy_s(cube1.str,"りっぽ~たーい、その1");
//ここです👆
cube1.no = 1;
cube1.tate = 4.0;
cube1.yoko = 5.0;
cube1.takasa = 6.0;
printf("%s\n", cube1.str);
printf("%d\n", cube1.no);
printf("%f\n", cube1.tate);
printf("%f\n", cube1.yoko);
printf("%f\n", cube1.takasa);
return 0;
}
アレサ「
strcpy_s(cube1.str,"りっぽ~たーい、その1");
の部分を
strcpy_s関数を使わずに
直接
構造体変数cube1のメンバ配列に代入する
cube1.str[100]="りっぽ~たーい、その1";
と記述しても
ビルドエラー
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー C3863 配列型 'char [100]' を割り当てることはできません。 Project18 c:\users\solarplexuss\source\repos\project18\project18\source.cpp 17
エラー (アクティブ) E0513 型 "const char *" の値を型 "char" のエンティティに割り当てることはできません Project18 c:\Users\solarplexuss\source\repos\Project18\Project18\Source.cpp 17
が表示されてしまいますの。
なぜなら
構造体変数cube1のメンバ配列となっている
cube1.str[100]は配列だからなのですね
構造体変数cube1のメンバ配列
cube1.str[100]は
cube1のCube型の構造体変数宣言
Cube cube1;
を実行し
構造体変数cube1が生成された時点で
生成されています
一度生成された
構造体変数cube1のメンバ配列
cube1.str[100]
には
cube1.str[100]="りっぽ~たーい、その1";
のように
文字列データを代入することはできません」
ソーラー「そういえば
構造体変数のメンバ配列でない通常の配列
char型の配列str{100]を
char str[100];
を実行した場合は
新たに
str[100]="りっぽ~たーい、その1";
のように
文字列データを代入することはできなかったね」
アレサ「
同様に
cube1のCube型の構造体変数宣言
Cube cube1;
を実行した場合は
構造体変数cube1のメンバ配列
cube1.str[100]
が生成されています
ですので
あらたに
構造体変数cube1のメンバ配列となっている
cube1.str[100]に
char str[100]="りっぽ~たーい、その1"
のように
文字列データを代入することはできないのですの」
ソーラー「そんな仕組みになっているのか・・・てへっ」
アレサ「
ここで
試しに
今のプログラムの中の
cube1.str[100]="りっぽ~たーい、その1";
を
cube1.str="りっぽ~たーい、その1";
に置き換えて
プログラムを実行してみます」
そのプログラムはこちらになります
👇
#include <stdio.h>
#include <string.h>
typedef struct Cube
{
char str[100];
int no;
float tate;
float yoko;
float takasa;
} Cube;
int main(void) {
Cube cube1;
cube1.str="りっぽ~たーい、その1";
//ここです👆
cube1.no = 1;
cube1.tate = 4.0;
cube1.yoko = 5.0;
cube1.takasa = 6.0;
printf("%s\n", cube1.str);
printf("%d\n", cube1.no);
printf("%f\n", cube1.tate);
printf("%f\n", cube1.yoko);
printf("%f\n", cube1.takasa);
return 0;
}
ビルド実行結果
エラー C3863 配列型 'char [100]' を割り当てることはできません。 エラー (アクティブ) E0137 式は変更可能な左辺値である必要があります
ソーラー「そういえば
ポインタ変数を使って
ポインタ変数に文字列データを代入する方法があったね
cube1.str="りっぽ~たーい、その1";
は
ポインタ変数
cube1.strに文字列データ"りっぽ~たーい、その1"
を代入しているってことかな?」
アレサ「そう、なのですの
ですが
cube1.str="りっぽ~たーい、その1";
を実行しても
構造体変数cube1のメンバ配列
cube1.str[100]
に
文字列データ"りっぽ~たーい、その1"
を代入することはできないのですの
構造体変数cube1のメンバ配列
cube1.str[100]
のアドレスは
cube1.strとなっているので
文字列データ"りっぽ~たーい、その1"
を
構造体変数cube1のメンバ配列
cube1.str[100]
に代入することができそうな感じですが
できないのですの
なぜなら
一度、生成された配列には
配列のアドレスを格納しているポインタ変数を用いても
💖後から💖
データを
上書きすることができないように
C言語では
設定されているからです」
ソーラー「
それに対し
構造体のメンバ変数でない
普通の
char*型のポインタ変数strに
文字列データ "りっぽ~たーい、その1"
を
char* str="りっぽ~たーい、その1";
と
代入する場合は
char* str="りっぽ~たーい、その1";
を実行した場合でも
どんどん
char*型のポインタ変数strに
別の文字列データを
代入することができたね
ですから
今のプログラムの」
👇
#include <stdio.h>
#include <string.h>
typedef struct Cube
{
char str[100];
//ここです👆
int no;
float tate;
float yoko;
float takasa;
} Cube;
int main(void) {
Cube cube1;
cube1.str="りっぽ~たーい、その1";
cube1.no = 1;
cube1.tate = 4.0;
cube1.yoko = 5.0;
cube1.takasa = 6.0;
printf("%s\n", cube1.str);
printf("%d\n", cube1.no);
printf("%f\n", cube1.tate);
printf("%f\n", cube1.yoko);
printf("%f\n", cube1.takasa);
return 0;
}
ビルド実行結果
エラー C3863 配列型 'char [100]' を割り当てることはできません。 エラー (アクティブ) E0137 式は変更可能な左辺値である必要があります
ソーラー「
strの構造体Cubeのメンバ配列宣言
char str[100];
の部分を
strの構造体Cube型のポインタ変数宣言
char* str
に切り替えれば
cube1の構造体変数宣言
Cube cube1;
を実行したときに生成される
構造体変数cube1のメンバ変数となっているポインタ変数str
つまり
cube1.str
に
cube1.str="りっぽ~たーい、その1";
を実行することにより
直接
文字列データ
"りっぽ~たーい、その1"
を代入することができます
そのプログラムはこちらですね
👇
#include <stdio.h>
#include <string.h>
typedef struct Cube
{
char* str;
//ここです👆
int no;
float tate;
float yoko;
float takasa;
} Cube;
int main(void) {
Cube cube1;
cube1.str="りっぽ~たーい、その1";
//ここです👆
cube1.no = 1;
cube1.tate = 4.0;
cube1.yoko = 5.0;
cube1.takasa = 6.0;
printf("%s\n", cube1.str);
printf("%d\n", cube1.no);
printf("%f\n", cube1.tate);
printf("%f\n", cube1.yoko);
printf("%f\n", cube1.takasa);
return 0;
}
ビルド実行結果
りっぽ~たーい、その1
1
4.000000
5.000000
6.000000
ソーラー、アレサ「あはは
いかがでしたか?
strcpy_s関数をつかって
構造体変数のメンバ配列に文字列データを格納する仕組み
や
構造体にポインタ変数のメンバ変数宣言を設定し
構造体変数宣言を行い
構造体変数のメンバ変数となっているポインタ変数に
文字列データを格納する方法
よくわかったかな😊」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます