質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

4回答

4294閲覧

C言語 共用体 構造体

bobslay

総合スコア32

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2016/01/16 15:34

編集2016/01/16 16:18

以下のような個人情報を格納するための型を構造体、共用体を組み合わせて構成し、はじめに文字列(null文字をあわせて38文字)にてデータを格納する。次に格納したデータを構成メンバとして取り出し、わかりやすく表示するプログラムを作成せよ。
{
20文字:(名前)または(個人番号(数字文字))
3文字:年齢(数字文字)
3文字:血液型
6文字:身長(数字文字、小数点以下1桁まで)
5文字:体重(数字文字、小数点以下1桁まで)) }

または {19文字+カンマ+2文字+カンマ+2文字+カンマ+5文字+カンマ+4文字+カンマ+null文字} (上の表現において「または」と書かれている部分については共用体を用いること。

これを教えてください。構造体と共用体のところが苦手でよくわかりません。

お手本のプログラムをいただけるとありがたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2016/01/16 16:13

こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
katoy

2016/01/16 17:07

こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
izkn

2016/01/16 22:28

こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
guest

回答4

0

ベストアンサー

こんにちは。

答えを書くとbobslayさんのためにならないので、ヒントを書いてみます。

例えば3文字を記憶する型は、char a[3];です。
また、共用体と構造体は下記にようにして組み合わせることができます。

C

1union type 2{ 3 struct 4 { 5 char name[3]; 6 char age[5]; 7 } data; 8 char total[9]; 9};

上記は、次のように表現できます。
{
3文字:名前
5文字:年齢 }

または {2文字+カンマ+4文字+カンマ+null文字}

まずは、課題の「個人情報を格納するための型」を定義してみてください。

そして、その領域を確保して"19文字+カンマ+2文字+カンマ+2文字+カンマ+5文字+カンマ+4文字+カンマ"を放り込みましょう。strcpy()を使えば一発です。

最後に、各々の文字列の','を0に置き換えて表示すれば簡単です。','の場所は分かっているのでなんてことないでしょう。
表示はprintf()を使ってタイトルも一緒に出力すれば、わかりやすく表示できると思いますよ。

もしかすると、(名前)または(個人番号(数字文字)) は、タイトルを「名前」か「個人番号」で変えた方が良いかも知れませんね。たぶん、数字だけで構成されていたら個人番号と判断すれば良いのではないでしょうか? 任意の1文字が数字であることはisdigit()を使えば判断できます。


【追記】
参考の型定義にミスがあったので修正してます。

投稿2016/01/16 16:44

編集2016/01/16 17:19
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bobslay

2016/01/16 17:20

#include<stdio.h> #include<string.h> typedef union{ char str[38]; struct{ char name[20]; char age[3]; char blo[3]; char height[6]; char weight[5]; }jo; }Jou; int main(void) { } こんな感じですか?
Chironian

2016/01/17 02:50

「(名前)または(個人番号(数字文字))」の部分がないように見えます。 この部分をunion化する意味は不明ですが、課題で指定されてますのでunionにした方が良いかも知れません。 後、他の方がおっしゃっているアライメントの問題ですが、厳密には確かに処理系依存ですが、char型に対してパディングをつける処理系は事実上ないので、今回のように全てchar型で定義する場合は気にしなくて良いと思います。 もし、アライメントに興味があれば下記に中々優れた解説がありました。 http://www5d.biglobe.ne.jp/~noocyte/Programming/Alignment.html
guest

0

学校の課題のようですので、お手本のプログラムは書きません。ご自身で試行錯誤して解決することがスキルアップにつながると思います。

ただ

構造体と共用体のところが苦手でよくわかりません。

とのことですので、ヒントだけ書いておきます。
構造体の書き方、共用体の書き方は習っていると思います。今回の課題で出題者の意図を汲んで考えると、何を構造体に、何を共用体にすればいいか見えてきます。

{

20文字:(名前)または(個人番号(数字文字)) 3文字:年齢(数字文字) 3文字:血液型 6文字:身長(数字文字、小数点以下1桁まで) 5文字:体重(数字文字、小数点以下1桁まで)

)

この部分は構造体に定義します。また

{19文字+カンマ+2文字+カンマ+2文字+カンマ+5文字+カンマ+4文字+カンマ+null文字}

この部分は文字列として定義します。それぞれ文字数を数えると両方とも38文字に収まっていますので、この二つを共用体として定義します。

ただし、問題はこのままだと、構造体側の各メンバの文字列に文字列終端のnull文字が入らないので、実質構造体のメンバがメンバとして機能しないことになります。実際に出力するとわかると思いますが、構造体の「名前」メンバを文字列で出力すると、おそらくカンマ区切りで「体重」のデータまで表示されてしまいます。

なので共用体の文字列側に格納した後、カンマを全てnull文字に置き換える処理をしてやらないといけません。そうすれば構造体側のメンバとして機能するようになります。頑張ってみてください。

投稿2016/01/16 17:05

KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bobslay

2016/01/16 17:19

#include<stdio.h> #include<string.h> typedef union{ char str[38]; struct{ char name[20]; char age[3]; char blo[3]; char height[6]; char weight[5]; }jo; }Jou; int main(void) { } こんな感じですか?
KoichiSugiyama

2016/01/16 23:50 編集

そうです。 あとは、構造体のメンバをそれぞれメンバ名とデータがわかるように出力してやればいいです。 ただ、他の方が書かれているようにコンパイルオプションによっては構造体のメモリ配置が必ずしも隙間なく詰められるとは限りません(通常はメンバの区切りをCPUが扱いやすいバイト数に揃えられてしまうことが多いです)。その場合、コンパイルオプションでアライメントを変更してやる必要が有ります。詳しくは「C 構造体 アライメント」などのキーワードで検索してみてください。 その上で使用されているCコンパイラのオプションを調べて、アライメントを調整する必要があるかを確認してください。
guest

0

ipadcaronも書かれていますが、Cの構造体はソースどおりに配置されません。
従って、実際にコンパイルしてデータを確認しないとサイズに対しても分かりません。
printf()などでサイズを表示させて見ましょうd^^
また、char str[38]の最初にchar name[20]がおかれるとは限らないと言う事も覚えておいてください。
[加筆]
以下のソースで実験d^^・・・環境とコンパイラはFreeBSD10.2-RELEASE-p8、clang version 3.4.1

C

1#include<stdio.h> 2#include<string.h> 3 4typedef union{ 5 char str[38]; 6 struct{ 7 char name[20]; 8 char age[3]; 9 char blo[3]; 10 char height[6]; 11 char weight[5]; 12 }jo; 13}Jou; 14 15int main(void){ 16 17 Jou j; 18 strcpy(j.str,"0123456789012345678901234567890123456"); 19 printf("%lu %s \n", sizeof j, j.jo.age); return 0; 20} 21~/test >./a.out 2238 01234567890123456 23~/test >

ここで見る限りは問題はなさそうですが、コンパイラ依存なので注意してください。

投稿2016/01/16 23:37

編集2016/01/17 00:17
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

この課題はどこのHPのものですか。
記憶が曖昧ですが、このデータ 38バイトを格納する構造体は、正確に38バイトにはなりませんよ。
何年前の書籍?自分で考えたものですか。

char data[38]

char d[20],de[3],se[3],aw[6],gf[5];
の異なる大きさの配列を共用体にしたい、ということですよね。

投稿2016/01/16 16:53

ipadcaron

総合スコア1693

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bobslay

2016/01/16 17:06

学校の課題です。 異なる大きさの配列を共用体にしたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問