C言語 構造体について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ウール
記事: 9
登録日時: 5年前

C言語 構造体について

#1

投稿記事 by ウール » 5年前

コード:

/* program91.c */

#define _CRT_SECURE_NO_WARNINGS
#define NO 5

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	int n;
	char point[8], name[32];

	struct _seiseki{
		char szName[32];
		int kokugo;
		int rika;
	} seiseki[NO];

	for (n = 0; n < NO; n++) {
		printf("%d番の氏名 -- ", n + 1);
		gets(seiseki[n].szName);
		printf("国語の点数 -- ");
		gets(point);
		seiseki[n].kokugo = atoi(point);
		printf("理科の点数 -- ");
		gets(point);
		seiseki[n].rika = atoi(point);
	}

	while (1) {
		printf("検索する氏名(Enterキーのみで終了) --- ");
		gets(name);
		if (strcmp(name, "") == 0)
			break;

		for (n = 0; n < NO; n++) {
			if (strstr(seiseki[n].szName, name))
				printf("%s 国語 %d点, 理科 %d点\n",
				seiseki[n].szName, seiseki[n].kokugo, seiseki[n].rika);
		}
	}

	return 0;
}
	

ウール
記事: 9
登録日時: 5年前

C言語 構造体について

#2

投稿記事 by ウール » 5年前

最近C言語の学習を独学で始めたのですが、参考書にてわからない点があるので、質問させてください。
猫でもわかるC言語を参考書に学習を進めているのですがP246問1、要約すると5人の氏名、国語、理科の点数を格納する構造体を作り氏名の一部を入力すると点数を表示するプログラムを作れとのことなのですが、最後に何故for文を使う必要があるのか理解できません。また最後にfor文を入れないと正しい点数が入力されないのはなぜでしょうか?
詳しい方、ご教授をよろしくお願い致します。
*ソースコードはテキストについている模範解答になります。
最後のfor文とはif(strstrの一行上のfor分になります。

Math

Re: C言語 構造体について

#3

投稿記事 by Math » 5年前

プログラムをVS2017Community C言語でコンパイル・実行してみましたが なんの疑問点もなく正常ですよ。

ソースコードにコメント文で 疑問点を直に書き入れてください。
この文面は理解不可能ですよ。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: C言語 構造体について

#4

投稿記事 by みけCAT » 5年前

問題を読んでいないのでもしかしたら「for文を使う」という指定があるのかもしれないですが、
そうでなければ別にfor文を使う必要は無いですね。
なぜなら、for文

コード:

for (A; B; C) D;
は、(Dにcontinue;を含まなければ) while文

コード:

{ /* Aが宣言を含む時、その影響が漏れないようにする */
    A;
    while(B) {
        D;
        C;
    }
}
と等価なので、代わりにwhile文を使えばいいからです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
あたっしゅ
記事: 663
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: C言語 構造体について

#5

投稿記事 by あたっしゅ » 5年前

 これは、入力された複数のデータから、目的のデータを検索する、というプログラムの演習でしょ。
今回は、5 件しかないから、コンピュータに入力してやるより、入力して人間が見て探した方がはやいけれども、

 現実の問題の場合は、例えば、大学入試センター試験とかだと、約 60 万人分、処理しなきゃならない
わけですよ。今回の課題だと、固定の配列に入れて、線形検索(「最後の for 文とは if(strstr の一行上の for 文」の
あたり)ですが、60 万人分だとハッシュ使いますかね。

 線形検索やハッシュ以外にも、二分木とか、あるわけですよ。で、https://ja.wikipedia.org/wiki/Standard_Template_Library STL 使うと、
アルゴリズム(「線形検索」や「ハッシュ」、「二分木」のこと)が簡単に切り替えられるんです。プログラミング道は、険(けわ)しいです。

 なぜ、線形検索で、しかも、STL 使わずに実装させるかといえば、
線形検索が、人間にとって、一番わかりやすいからです。

 いまのところ、何を言っているのかわからない、かもしれませんが、プログラミングを続けていると、
必ず、やることになりますので、大雑把(おおざっぱ)でもいいですから、頭の隅に入れておいてください。
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

ウール
記事: 9
登録日時: 5年前

Re: C言語 構造体について

#6

投稿記事 by ウール » 5年前

/* program91.c */

#define _CRT_SECURE_NO_WARNINGS
#define NO 5

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
int n;
char point[8], name[32];

struct _seiseki{
char szName[32];
int kokugo;
int rika;
} seiseki[NO];

for (n = 0; n < NO; n++) {
printf("%d番の氏名 -- ", n + 1);
gets(seiseki[n].szName);
printf("国語の点数 -- ");
gets(point);
seiseki[n].kokugo = atoi(point);
printf("理科の点数 -- ");
gets(point);
seiseki[n].rika = atoi(point);
}

while (1) {
printf("検索する氏名(Enterキーのみで終了) --- ");
gets(name);
if (strcmp(name, "") == 0)
break;

for (n = 0; n < NO; n++) { /*この部分のforが何に使われているかわかりません。*/
if (strstr(seiseki[n].szName, name))
printf("%s 国語 %d点, 理科 %d点\n",
seiseki[n].szName, seiseki[n].kokugo, seiseki[n].rika);
}
}

return 0;
}

ウール
記事: 9
登録日時: 5年前

Re: C言語 構造体について

#7

投稿記事 by ウール » 5年前

3人ともご丁寧にお答え頂きありがとうございます。
ソース文にコメントを載せたほうがわかりやすいですよね。また、これは模範解答になりますのでfor文を使いなさいと言ったような指示はありません。私自身が模範解答を見てわからないところを質問しているしだいです。

また、最後のfor文は要は目的の数値を見つけやすいとの事でしたが、このfor文を入れないと実際の点数ではなく、無茶苦茶な数値が入るのはなぜでしょうか?
for文を入れる事によって目的の数値を探しているから、この文を入れないと探せないと言うことでしょうか?

ウール
記事: 9
登録日時: 5年前

Re: C言語 構造体について

#8

投稿記事 by ウール » 5年前

ウール さんが書きました:
5年前

コード:

/* program91.c */

#define _CRT_SECURE_NO_WARNINGS
#define NO 5

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	int n;
	char point[8], name[32];

	struct _seiseki{
		char szName[32];
		int kokugo;
		int rika;
	} seiseki[NO];

	for (n = 0; n < NO; n++) {
		printf("%d番の氏名 -- ", n + 1);
		gets(seiseki[n].szName);
		printf("国語の点数 -- ");
		gets(point);
		seiseki[n].kokugo = atoi(point);
		printf("理科の点数 -- ");
		gets(point);
		seiseki[n].rika = atoi(point);
	}

	while (1) {
		printf("検索する氏名(Enterキーのみで終了) --- ");
		gets(name);
		if (strcmp(name, "") == 0)
			break;

		for (n = 0; n < NO; n++) { /*この部分のforが何に使われているかわかりません。*/
			if (strstr(seiseki[n].szName, name))
				printf("%s 国語 %d点, 理科 %d点\n",
				seiseki[n].szName, seiseki[n].kokugo, seiseki[n].rika);
		}
	}

	return 0;
}

アバター
usao
記事: 1887
登録日時: 11年前

Re: C言語 構造体について

#9

投稿記事 by usao » 5年前

> 氏名の一部を入力すると点数を表示する

つまり,「入力された氏名の一部に対して,どのデータを表示すべきか?」を判断する必要がある.

データは5つあるから,
・最初のデータは表示すべきか?
・2番目のデータは表示すべきか?
・…
・5番目のデータは表示すべきか?
の判断を行わねばならない.
言い換えれば,
5つのデータ全てに関して,入力と照らし合わせて,そのデータを表示すべきか否かの判定処理を行う必要がある.

「5つのデータ全てに関してXXXする」というのを実装する手段として,そのコードでは(たまたま)forを用いた,というだけのことでしょう.

例えば,要素数5の配列 a[5] の全ての要素をprintfで出力したいとき,forを使って

コード:

int i;
for( i=0; i<5; ++i )
{
  printf( "%d\n", a[i] );
}
とか書けますよね.それと一緒でしょう.
(これに対して「何でforを使ったの?」と問われても,「まぁ…これが楽な方法だったから……?」という答えになるかなぁ)

アバター
usao
記事: 1887
登録日時: 11年前

Re: C言語 構造体について

#10

投稿記事 by usao » 5年前

これ以上補足不要だとは思うけど,
わからんと言われているforの箇所を日本語で書けば,下のような話でしょう.

コード:

//5つのデータ全てに関して,それを表示すべきか否かを調べ,表示すべきなら表示する
for( int i=0; i<5; ++i )  //5つのデータに関してループ
{
  if( i番目のデータは表示すべきか? )
  {
    i番目のデータを表示する
  }
}
べつにforを使わずに,他の方がおっしゃるようにwhileとか使っても実装できるでしょうし,
極端な話(?),データ数が5個だと決め打ちするならば

コード:

//5つのデータ全てに関して,それを表示すべきか否かを調べ,表示すべきなら表示する
if( 1番目のデータを表示すべきか? ){ 1番目のデータを表示する }
if( 2番目のデータを表示すべきか? ){ 2番目のデータを表示する }
if( 3番目のデータを表示すべきか? ){ 3番目のデータを表示する }
if( 4番目のデータを表示すべきか? ){ 4番目のデータを表示する }
if( 5番目のデータを表示すべきか? ){ 5番目のデータを表示する }
とか書いてもまぁ目的は達成できる.

(前者の(for使う)書き方と,後者の書き方を比較して「どっちで書きたいか?」みたいな世界の話になるのかな?)

Math

Re: C言語 構造体について

#11

投稿記事 by Math » 5年前

質問者様の質問は 2点あり1点にしか答えてないうえ全て間違っています。(^^;

質問その1::#2に書いてあるのでは >何故for文を使う必要があるのか理解できません。

質問その2::#2に書いてあるのでは >また最後にfor文を入れないと正しい点数が入力されないのはなぜでしょうか
     ::#7では  >また、最後のfor文は要は目的の数値を見つけやすいとの事でしたが、このfor文を入れないと実際の点数ではなく、無茶苦茶な数値が入るのはなぜでしょうか?

質問その1については配列 演算と間違えても正常動作するようにC言語を作ってあるのですが本当は全然違うものです。

質問その2: については質問者様にその症状になるソースコードを提示して頂きたくお願い致します。検討することができないので。

まあ C言語らしく書くとこうなるとおもいますね。

コード:

/* program91.c */

#define _CRT_SECURE_NO_WARNINGS
#define NO 5

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	int n;
	char point[8], name[32];
	////////////////////////////// 構造体
	typedef struct _seiseki {   //
		char szName[32];        // 名前  文字列
		int kokugo;             // 国語  点数:整数型
		int rika;               // 理科  点数:整数型
	} seiseki_t;                // seiseki_t というオブジェクト型(構造体型)を作る
	//////////////////////////////
	seiseki_t seiseki[NO];      // オブジェクト型(構造体型) 配列
	seiseki_t* obj_p;           // オブジェクト型(構造体型) ポインター
	////////////////////////////// 
	for (n = 0; n < NO; n++) {
		printf("%d番の氏名 -- ", n + 1);
		gets(seiseki[n].szName);
		printf("国語の点数 -- ");
		gets(point);
		seiseki[n].kokugo = atoi(point);
		printf("理科の点数 -- ");
		gets(point);
		seiseki[n].rika = atoi(point);
	}
	

	while (1) {
		printf("検索する氏名(Enterキーのみで終了) --- ");
		gets(name);
		if (strcmp(name, "") == 0)
			break;

		//for (n = 0; n < NO; n++) {  /*この部分のforが何に使われているかわかりません。*/
			//if (strstr(seiseki[n].szName, name))
				//printf("%s 国語 %d点, 理科 %d点\n",
					//seiseki[n].szName, seiseki[n].kokugo, seiseki[n].rika);
		//}

		obj_p = seiseki;  // 配列名は先頭のアドレスを持っている
		
		while (obj_p !=NULL) {
			if (strstr(obj_p->szName, name)){
				printf("%s 国語 %d点, 理科 %d点\n",
					obj_p->szName, obj_p->kokugo, obj_p->rika); 
				break;
			}
			obj_p++;  //-----ポインターを一個進める---------------
		}

	}

	return 0;
}


ウール
記事: 9
登録日時: 5年前

Re: C言語 構造体について

#13

投稿記事 by ウール » 5年前

usaoさん、Mathさんご丁寧な回答ありがとうございます。
何故for文を使わないといけないのかって質問でしたが、名前を探してくる[strstr]の関数を使っているのに、何故、for文で繰り返し処理を実行しなければいけないか、疑問でした。ですが皆さんのおかげで解決に向かいそうです。
また、ご指摘のあった、質問その2ですが下記のソースコードになります。
そのまま、上のソースコードからfor文だけを抜いた形になります。

[

ウール
記事: 9
登録日時: 5年前

Re: C言語 構造体について

#14

投稿記事 by ウール » 5年前

コード:


#define _CRT_SECURE_NO_WARNINGS
#define NO 5

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	int n;
	char point[8], name[32];

	struct _seiseki{
		char szName[32];
		int kokugo;
		int rika;
	} seiseki[NO];

	for (n = 0; n < NO; n++) {
		printf("%d番の氏名 -- ", n + 1);
		gets(seiseki[n].szName);
		printf("国語の点数 -- ");
		gets(point);
		seiseki[n].kokugo = atoi(point);
		printf("理科の点数 -- ");
		gets(point);
		seiseki[n].rika = atoi(point);
	}

	while (1) {
		printf("検索する氏名(Enterキーのみで終了) --- ");
		gets(name);
		if (strcmp(name, "") == 0)
			break;

		//ここのfor文をなくしました
			if (strstr(seiseki[n].szName, name))
				printf("%s 国語 %d点, 理科 %d点\n",
				seiseki[n].szName, seiseki[n].kokugo, seiseki[n].rika);
		
	}

	return 0;
}

Math

Re: C言語 構造体について

#15

投稿記事 by Math » 5年前

予想通りでたらめな「出力」をしているのであって「入力」は関係ありません。

コード:


#define _CRT_SECURE_NO_WARNINGS
#define NO 5

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	int n;
	char point[8], name[32];

	struct _seiseki{
		char szName[32];
		int kokugo;
		int rika;
	} seiseki[NO];

	for (n = 0; n < NO; n++) {
		printf("%d番の氏名 -- ", n + 1);
		gets(seiseki[n].szName);
		printf("国語の点数 -- ");
		gets(point);
		seiseki[n].kokugo = atoi(point);
		printf("理科の点数 -- ");
		gets(point);
		seiseki[n].rika = atoi(point);
	}
//-----------この時点で n の値は 5 になっている----------------------------------------------------------
	while (1) {
		printf("検索する氏名(Enterキーのみで終了) --- ");
		gets(name);
		if (strcmp(name, "") == 0)
			break;

		//ここのfor文をなくしました
			if (strstr(seiseki[n].szName, name)) //-----n が 5 なので
			                                      // メモリーの範囲外をアクセスし
			                                      // でたらめな値を出力する
				printf("%s 国語 %d点, 理科 %d点\n",
				seiseki[n].szName, seiseki[n].kokugo, seiseki[n].rika);
		
	}

	return 0;
}

Math

Re: C言語 構造体について

#16

投稿記事 by Math » 5年前

#2 の
>点数を格納する構造体を作り氏名の一部を入力すると点数を表示するプログラムを作れとのことなのですが、最後に何故for文を使う必要があるのか理解できません


可笑しいと思ってました(^^;

一名の名前を入力してますよね。その人を検索しますよね。

アバター
usao
記事: 1887
登録日時: 11年前

Re: C言語 構造体について

#17

投稿記事 by usao » 5年前

文字列の【部分一致】で検索するって話でしょ.

かずま

Re: C言語 構造体について

#18

投稿記事 by かずま » 5年前

Math さんが書きました:
5年前
まあ C言語らしく書くとこうなるとおもいますね。

コード:

		obj_p = seiseki;  // 配列名は先頭のアドレスを持っている
		
		while (obj_p !=NULL) {
			if (strstr(obj_p->szName, name)){
				printf("%s 国語 %d点, 理科 %d点\n",
					obj_p->szName, obj_p->kokugo, obj_p->rika); 
				break;
			}
			obj_p++;  //-----ポインターを一個進める---------------
		}
そのプログラムで、登録されていない名前を検索すると
不正な出力になります。
obj_p が NULL になることはありません。

また、Hirose Alice と Hisose Suzu が登録されているとき、
#1 の元のプログラムで、Hirose を検索すると、
2つの情報が表示されますが、この #11 のプログラムでは
1つしか出てきません。

Math

Re: C言語 構造体について

#19

投稿記事 by Math » 5年前

>文字列の【部分一致】で検索するって話でしょ

そうですよね。

そもそもの 勘違いが構造体全体から【部分一致】で検索できる 
との思い込みから きてますよね。

構造体型の宣言のところで } seiseki[NO]; と一塊にみえたのでしょうね(^^;

アバター
あたっしゅ
記事: 663
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: C言語 構造体について

#20

投稿記事 by あたっしゅ » 5年前

>何故 for 文を使わないといけないのかって質問でしたが、名前を探してくる[strstr]の関数を使っているのに、
>何故、for文で繰り返し処理を実行しなければいけないか、疑問でした。
>ですが皆さんのおかげで解決に向かいそうです。
  
やっと、質問者の意図が分かりました。

コード:

  
A:		for (n = 0; n > NO; n++) {
B:			if (strstr(seiseki[n].szName, name))
C:				printf("%s 国語 %d点, 理科 %d点\n",
D:				seiseki[n].szName, seiseki[n].kokugo, seiseki[n].rika);
E:		}
  
B:行で strstr 関数を使ってますが、ここは、strcmp 関数を用いて
if(strcmp(seiseki[n].szName, name)==0) でないと駄目です。
http://hitorilife.com/strstr.php strstr 関数(ja)  
アセンブラで書くと

コード:

db "A-ko", 0, 0, 0, 0, 0, 0,.. ;; 省略
dd 100, 0
db "B-ko", 0, 0, 0, 0, 0, 0,.. ;; 省略
dd  90, 10
db "C-ko", 0, 0, 0, 0, 0, 0,.. ;; 省略
dd  80, 20
db "D-ko", 0, 0, 0, 0, 0, 0,.. ;; 省略
dd  70, 30
db "E-ko", 0, 0, 0, 0, 0, 0,.. ;; 省略 
dd  60, 40
となるので、strstr で一気に検索することはできません。
「一単位づつ strcmp で比較」を for で回す必要があります。
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

アバター
あたっしゅ
記事: 663
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: C言語 構造体について

#21

投稿記事 by あたっしゅ » 5年前

>A: for (n = 0; n > NO; n++) {

不等号の向きが、逆ですね。'<' が正しい。
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

Math

Re: C言語 構造体について

#22

投稿記事 by Math » 5年前

そうか
#2の

*ソースコードはテキストについている模範解答になります。

に騙さた!

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: C言語 構造体について

#23

投稿記事 by みけCAT » 5年前

あたっしゅ さんが書きました:
5年前
B:行で strstr 関数を使ってますが、ここは、strcmp 関数を用いて
if(strcmp(seiseki[n].szName, name)==0) でないと駄目です。
これは誤りです。
なぜなら、#2で「氏名の一部を入力すると点数を表示する」という条件があるのに、
この条件式では氏名全体を入力しないと該当する点数が表示されくなってしまうからです。

同様に、
あたっしゅ さんが書きました:
5年前
「一単位づつ strcmp で比較」を for で回す必要があります。
も誤りです。
以下のようにforを二重にし、
構造体に記録した氏名のデータからマッチする可能性がある部分をstrcmpで比較していく方法もありますが、
上司や先生などからの指示、宗教上の理由、縛りプレイなどの理由が無いのであれば、
素直にstrstrを使ったほうが簡単でしょう。

コード:

		for (n = 0; n < NO; n++) {
			size_t name_length = strlen(name);
			size_t simei_length = strlen(seiseki[n].szName);
			size_t i;
			int matched = 0;
			for (i = 0; i + name_length <= simei_length; i++) {
				char simei_part[32];
				strcpy(simei_part, seiseki[n].szName + i);
				simei_part[name_length] = '\0';
				if (strcmp(simei_part, name) == 0) matched = 1;
			}
			if (matched)
				printf("%s 国語 %d点, 理科 %d点\n",
				seiseki[n].szName, seiseki[n].kokugo, seiseki[n].rika);
		}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: C言語 構造体について

#24

投稿記事 by かずま » 5年前

みけCAT さんが書きました:
5年前
以下のようにforを二重にし、
構造体に記録した氏名のデータからマッチする可能性がある部分をstrcmpで比較していく方法もありますが、
上司や先生などからの指示、宗教上の理由、縛りプレイなどの理由が無いのであれば、
素直にstrstrを使ったほうが簡単でしょう。

コード:

		for (n = 0; n < NO; n++) {
			size_t name_length = strlen(name);
			size_t simei_length = strlen(seiseki[n].szName);
			size_t i;
			int matched = 0;
			for (i = 0; i + name_length <= simei_length; i++) {
				char simei_part[32];
				strcpy(simei_part, seiseki[n].szName + i);
				simei_part[name_length] = '\0';
				if (strcmp(simei_part, name) == 0) matched = 1;
			}
			if (matched)
				printf("%s 国語 %d点, 理科 %d点\n",
				seiseki[n].szName, seiseki[n].kokugo, seiseki[n].rika);
		}
strncmp を使えばもっと簡単です。

コード:

		size_t len = strlen(name);
		for (n = 0; n < NO; n++) {
			char *p = seiseki[n].szName;
			for (; *p && strncmp(p, name, len); p++) ;
			if (*p) {
				printf("%s 国語 %d点, 理科 %d点\n",
				seiseki[n].szName, seiseki[n].kokugo, seiseki[n].rika);
			}
		}
実行例

コード:

1番の氏名 -- Ishida Yuriko
国語の点数 -- 90
理科の点数 -- 80
2番の氏名 -- Hirose Alice
国語の点数 -- 70
理科の点数 -- 60
3番の氏名 -- Ayase Haruka
国語の点数 -- 50
理科の点数 -- 40
4番の氏名 -- Ishida Hikari
国語の点数 -- 30
理科の点数 -- 20
5番の氏名 -- Hirose Suzu
国語の点数 -- 10
理科の点数 -- 0
検索する氏名(Enterキーのみで終了) --- Hirose
Hirose Alice 国語 70点, 理科 60点
Hirose Suzu 国語 10点, 理科 0点
検索する氏名(Enterキーのみで終了) --- Haruka
Ayase Haruka 国語 50点, 理科 40点
検索する氏名(Enterキーのみで終了) ---

naohiro19
記事: 256
登録日時: 13年前
住所: 愛知県

Re: C言語 構造体について

#25

投稿記事 by naohiro19 » 5年前

<stdio.h>(C++では<cstdio>)に宣言されている gets関数は GCC/Clang/Visual Studioの環境では
2011年の C言語の規格 C11 および C++11 では gets関数自体が削除されていますので、使うことはできません。

代わりに fgets関数か、 gets_s関数を使うべきでしょう。

Math

Re: C言語 構造体について

#26

投稿記事 by Math » 5年前

VS2017Community で

コード:

1>------ ビルド開始: プロジェクト: Project1, 構成: Debug Win32 ------
1>main.c
1>c:\19\01\c\001\project1\project1\main.c(23): warning C4013: 関数 'gets' は定義されていません。int 型の値を返す外部関数と見なします。
1>Project1.vcxproj -> C:\19\01\c\001\Project1\Debug\Project1.exe
1>プロジェクト "Project1.vcxproj" のビルドが終了しました。
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========
となるのは そいう意味だったのですね。

説明文をだしてエラーにすればいいのに(^^;

アバター
あたっしゅ
記事: 663
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: C言語 構造体について

#27

投稿記事 by あたっしゅ » 5年前

 strcmp って書いたのは、問題をよく読んでなかったから。
 これ、学校の課題でしょ。問い一「完全一致」、問い二「部分一致」で、問い一は、わかったけど、問い二がわからない、とかじゃ、ないの ? というふうに、エスパーしてみました。
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

返信

“C言語何でも質問掲示板” へ戻る