【独学C言語入門㉒】構造体に文字列を入れる

今回は構造体のメンバーに文字列を使用してみます。

//構造体テンプレートの宣言
struct man {
    char name[10];
    int age;
};

//構造体変数の宣言のみ
struct man taro;

//構造体変数の宣言と初期化を同時
struct man taro = {"taro",20};

//縦に書いても良い
struct man taro = {"taro", 
                    20
};

実際にテストしてみます。

#include <stdio.h>

struct man {
	char name[10];
	int age;
};

main()
{
	//構造体変数の宣言と初期化
	struct man taro = {"taro",20};

  //taro.name ="aki"; これではエラー

	strcpy_s(taro.name, 10,"aki");

	printf("%s\n", taro.name);
	printf("%d\n", taro.age);
}

//右が切れたら左にスワイプしてください

以前、ご説明しましたがC言語の場合、文字列は1度代入をすると変更できず、strcpy_sを使用する必要があるため手間がかかります。

しかし、実は次のように構造体の中の文字列をポインタで宣言することで使い勝手が良くなります。実行結果は先ほどと同じです。ここから先はまだ理解されなくて大丈夫です。参考程度にさらっと確認してもらえればと思います。

#include <stdio.h>

struct man {
	char *name;  //ポインタで宣言
	int age;
};

main()
{
	//構造体変数の宣言と初期化
	struct man taro = {"taro",20};

	taro.name = "aki"; //代入でOK

	printf("%s\n", taro.name);
	printf("%d\n", taro.age);
}

//右が切れたら左にスワイプしてください

さらに構造体の中の文字列をポインタで宣言するメリットがあります。最初のchar name[10]だとNULLがあるので9文字までしか変数に入れることができません。しかも、構造体の中のcharはchar name[]のように要素数を省略することができません。しかし、ポインタで宣言すると新たに代入する文字列の長さが事実上制限されなくなります。そのため、どのくらいの長さの文字列が入るか予想しづらい場合は安心です。

#include <stdio.h>

struct man {
	char *name;  //ポインタで宣言
	int age;
};

main()
{
	//構造体変数の宣言と初期化
	struct man taro = { "taro",20 };

	taro.name = "taroooooooooooooooooooooooo"; //代入でOK

	printf("%s\n", taro.name);
	printf("%d\n", taro.age);
}

//右が切れたら左にスワイプしてください

今回、構造体の中に文字列を宣言する方法をご紹介しました。一般的には文字列をポインタで宣言する場合が多いですが、並行して覚えることが増えると理解しづらくなりますので、まずはこのような宣言方法もあるんだなくらいに思ってもらえればと思います。

この入門ではまずはchar name[10]のような宣言を使用させて頂きます。

独学C言語入門一覧に戻る