ページ 11

配列構造体

Posted: 2009年11月19日(木) 14:37
by SSS
こんにちは。
初めて質問させていただきます。

名前、住所、誕生日、電話番号を格納する構造体の配列を10個作って、10人分のデータを入れたいのですがなぜか途中でコマンドプロンプトの表示が崩れて(文字化けが起こる)正常に終了できなくなってしまいます。
コンパイラは特にエラーを吐いていないので理由が分からなくて困っています。

使用しているコンパイラは「LSI C-86 Ver 3.30 試食版」です。

よろしくお願いします。
#include<stdio.h>
#include<string.h>

struct date{
	char name[128];
	char address[128];
	char birthday[128];
	char phonenumber[128];
};

int getkey(char*a){
	int i;
	for(i=0;(a=getchar())!='\n';i++){
	}
	a='\0';
	return strlen(a);
}

int getdate(struct date *p1){
	
	char input[128];
	
	printf("「名前」、「住所」、「生年月日」、「電話番号」を入力してください\n名前をどうぞ(全角で10文字まで)\n>");
	
	getkey(input);
	sprintf(p1->name,input);
	
	printf("住所をどうぞ\n>");
	getkey(input);
	sprintf(p1->address,input);
	
	printf("生年月日をどうぞ(yyyy/mm/dd)\n>");
	getkey(input);
	sprintf(p1->birthday,input);
	
	printf("電話番号をどうぞ\n>");
	getkey(input);
	sprintf(p1->phonenumber,input);
	
	return 0;
}

int main(void){
	
	int i=0;
	struct date Pdate[10];
	
	for(i=0;i<6;i++){
		printf("\n%d人目の",i+1);
		getdate(&Pdate);
	}
	
	for(i=0;i<6;i++){
		printf("\n%d人目の\n名    前:%s\n",i+1,Pdate.name);
		printf("住    所:%s\n",Pdate.address);
		printf("生年月日:%s\n",Pdate.birthday);
		printf("電話番号:%s\n",Pdate.phonenumber);
	}
	
	return 0;
}

Re:配列構造体

Posted: 2009年11月19日(木) 16:10
by non
BCCで動かしてみましたが、字化けはおきませんでした。
コンパイラをもうすこし、まともなものに変えてみてはいかがですか。

Re:配列構造体

Posted: 2009年11月19日(木) 16:30
by toyo
ちょろっと検索したらLSI-Cのスタックサイズは2500バイトとの情報がありました
http://hp.vector.co.jp/authors/VA029427/v-lsic2.htm
512バイトの構造体10個だと完全にスタックオーバーフローしちゃいます
試食版だとスモールモデルでintも2バイトだし制限多いので他のコンパイラの使用をお勧めします

Re:配列構造体

Posted: 2009年11月19日(木) 17:46
by SSS
配列の大きさ調整したらちゃんと動くようになりました!!
ありがとうございます。

課題で指定されてるコンパイラなので厳しいですねぇ・・・
少し工夫しながら使ってみようと思います。

Re:配列構造体

Posted: 2009年11月19日(木) 20:22
by Hermit
どうしても lsic330c 試食版にしたいなら、
スタックサイズが変更できたはずです。
smallモデルだから、プログラムエリアが64kb スタック領域と、heap領域の合計が64kb
合計で 128kb MAX までは使えたと記憶してますが・・・
最近 lcc というと、AT&T の lcc がはいっているので、lsic は入れたくないので・・・
チェックしてません(^^;