構造体のメンバ配列宣言を行い、構造体変数のメンバ配列に😊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関数をつかって


構造体変数のメンバ配列に文字列データを格納する仕組み





構造体にポインタ変数のメンバ変数宣言を設定し


構造体変数宣言を行い


構造体変数のメンバ変数となっているポインタ変数に


文字列データを格納する方法



よくわかったかな😊」

















        










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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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