構造体です

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ニイ

構造体です

#1

投稿記事 by ニイ » 17年前

質問です。
以下のプログラムで、Inout dataの中で、"END"と入力されたら、終了する条件を追加したいんですけど、どうすればいいでしょうか?
returnを使っても、次に入力が進んでしまいます(汗)
NOT_END等を使用して、メインにアドレス返却する方法を使うみたいですけど、よく分かりませんm(_ _)m
#include <stdio.h>
#include <string.h>


#define PERSONDATA_MAX    2                  /* 個人データの最大件数     */
#define NAME_MAX          19                 /* 名前の最大文字数         */
#define BUF               256                /* 一時領域の大きさ         */

	int name(char);

typedef struct person                        /* 個人データ構造体の宣言   */
{
    char name[NAME_MAX+1];                   /* 名前                     */
	double height;
	double weight;
	double l;
	double r;

}Person;

void sort_data(Person *, int);
void disp_data(Person *, int);
void input_data(Person *);

int main(void)
{
    int cnt;

    Person member[PERSONDATA_MAX];                /* 構造体配列の定義          */

    for(cnt = 0 ; cnt < PERSONDATA_MAX ; cnt++)
	{



		
		input_data(&member[cnt]); 
		
    sort_data(&member[0], PERSONDATA_MAX);
	
	}
    disp_data(&member[0],cnt);         /* 出力関数呼出し            */

    return 0;
}


void disp_data(Person *pmem, int max_cnt)                /* 入力データ表示関数        */
{
    int cnt;                                /* ループのカウンタ          */

   printf("\n********Nama***********Hi*****We***(L) Eye (R)**\n");
    for(cnt = 0 ; cnt < PERSONDATA_MAX ; cnt++)
    {
     

	 sort_data(&pmem[0], PERSONDATA_MAX);

        printf("%-*s  %5.1f  %5.1f  %5.3f  %5.3f\n",NAME_MAX,&pmem[cnt].name[0],pmem[cnt].height,pmem[cnt].weight,pmem[cnt].l,pmem[cnt].r);
    }
    printf("\n");

    return;
}




void input_data(Person *pmem)               /* データ入力関数            */
{
	char buf[BUF];
	
       while(1)
        {
            printf("\nName   : ");
            scanf("%s",&buf[0]);             /* 名前の入力               */
            if(strlen(&buf[0]) <= NAME_MAX)  /* 入力文字数のチェック     */
            {
                strcpy(&pmem->name[0],&buf[0]);
                break;                       /* メンバにコピー           */
            } 
            printf("\nSorry. Input less than %d characters.\n",
                                                            NAME_MAX+1);
        
	   
	   
}



        printf("Height : ");
        scanf("%lf",&pmem->height);

        printf("Weight : ");
        scanf("%lf",&pmem->weight);

        printf("Eye(L) : ");
        scanf("%lf",&pmem->l);

        printf("Eye(R) : ");
        scanf("%lf",&pmem->r);
 
    return;
}

void sort_data(Person *pmem, int max_cnt)
{
int cnt1;
int cnt2;
Person temp;

for(cnt1 = 0; cnt1<max_cnt-1; cnt1++)
{
	for(cnt2=cnt1+1; cnt2<max_cnt; cnt2++)
	{
		if( (pmem +cnt1)->height > (pmem +cnt2)->height )
		{
			temp = *(pmem +cnt1);
			*(pmem +cnt1) = *(pmem +cnt2);
			*(pmem +cnt2) = temp;
		}
	}
}
}

管理人

Re:構造体です

#2

投稿記事 by 管理人 » 17年前

それは関数に返り値を持たせてやればいいんですよ。
こんな風に。
そしてバッファオーバーする可能性のあるような文字列の入力にscanfを使ってはいけません。
というのも、scanfは用意した配列のサイズ以上の入力があってもお構いなしに書き込んでしまうからです。
つまり、違うデータが保存されている領域も侵してしまいます。
scanf("%10s")などの数字を書く方法もありますが、それならfgetsが主流でしょう。
後、方法は色々あると思いますが、今のプログラムを活かすなら、文字列を入れる配列のサイズをもう+1してやって、規定サイズをオーバーしていないかチェックしてみるといいと思います。

あと、バッファから入りきらなかった入力はバッファにたまってしまうので、入力の前にfflash(stdin)をしてバッファをクリアしておいた方がいいと思います。

そして、入力文字列には改行コードが入るので削除しておきます。

入力された文字列がENDなら-1を返し、そうでなければ0を返します。
メイン内で受け取った変数に応じて条件分岐させればメイン関数ないでも操作可能です。
#include <stdio.h>
#include <string.h>

#define NAME_MAX 16

int input_data(int a){
	int i;
	char buf[NAME_MAX+2];
	while(1)
	{
		printf("\n%d回目\n",a);
		printf("\nName   : ");
		fflush(stdin);//バッファのクリア
		fgets(buf,NAME_MAX+2,stdin);             /* 名前の入力               */
		for(i=0;i<NAME_MAX+1;i++){//改行コード削除
			if(buf=='\n'){
				buf='\0';
				break;
			}
		}
		if(strlen(&buf[0]) <= NAME_MAX)  /* 入力文字数のチェック     */
		{
			printf("OK! [%s]の文字列を認識\n",buf);
			break;                       /* メンバにコピー           */
		}
		printf("\nSorry. Input less than %d characters.\n",NAME_MAX);
	}
	if(strcmp(buf,"END")==0)
		return -1;
	else
		return 0;
}

int main(){
	int i,get;
	for ( i = 0; i < 10; i++ ) {
		get = input_data(i);
		if(get==-1)
			break;
	}
	printf( "終了\n" );
	return 0;
}
 

tk-xleader

Re:構造体です

#3

投稿記事 by tk-xleader » 17年前

>バッファから入りきらなかった入力はバッファにたまってしまうので、入力の前にfflash(stdin)をしてバッファをクリアしておいた方がいいと思います。

fflush(stdin);

は書いてはいけないコードです。未定義か不定かは分かりませんが…

たかぎ

Re:構造体です

#4

投稿記事 by たかぎ » 17年前

> fflush(stdin);
> は書いてはいけないコードです。未定義か不定かは分かりませんが…

未定義です。
http://www.kijineko.co.jp/tech/supersti ... tream.html

閉鎖

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