9c32095626a2a97099cab34222d22238

1: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:08:27.967 ID:3mPqHcC90.net
いくよ

#include
#include

typedef struct{
char name[256];
int age;
char sex[256];
}data;

void write(data *profile);
void show(data *profile);



3: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:09:46.713 ID:3mPqHcC90.net
int main(void)
{
data *profile;
int i = 0,count = 0,size = 2;

/*初期領域の確保*/
profile = (data*)malloc(sizeof(data) * size);
if(profile == NULL)exit(0);

/*入力関数呼び出し*/

while(1){
printf("312人目の情報を入力して下さい。\n年齢に「-1」で終了。\n",i+1);
write(&profile[i]);
if(profile[i].age == -1){
printf("入力を終了します\n");
break;
}
i++;

if(i+1 > size){
size += 2;
printf("領域確保!!!\n");
profile = (data*)realloc(profile,sizeof(data) * size);



2: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:09:38.495 ID:63n4qfVg0.net
関数writeは重複してるから名前を変えろ



6: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:10:48.957 ID:Za9eGAyc0.net
なんでこういう貼り方するん
gistとか使えよ見辛くてしゃーない



9: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:12:46.642 ID:3mPqHcC90.net
>>2
え 本当?
普通に問題なかったんだが…
あ、他のヘッダファイルにあるって事?

>>6
gistってググったらがんの奴しか出てこなかった



12: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:14:31.038 ID:ZPO1CVgC0.net
何でもいいからコード貼れるサイトで貼ってくれ
インデントされてないと見づらくて仕様がない



16: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:16:15.318 ID:3mPqHcC90.net



14: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:15:17.658 ID:1OW/fJKFM.net
ちゃんとみてないけどsizeとかコマンドラインでわたしたほうがかっこいいとおもいました。



20: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:19:46.103 ID:3mPqHcC90.net
>>14
sizeをコマンドラインで渡す…



23: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:21:09.973 ID:3mPqHcC90.net
>>14
あ、手入力でって意味ですか?



17: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:17:59.692 ID:zuAqn4cJ0.net
見てどうしろというのか



20: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:19:46.103 ID:3mPqHcC90.net
>>17
こう書いたらもっとスマートとか
ここが変とか書き方のお作法みたいのを教えてほしい



18: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:19:34.479 ID:63n4qfVg0.net
つーか必要無いのにmallocは止めろ
極力使うな



23: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:21:09.973 ID:3mPqHcC90.net
>>18
けどそれしないと最初に決めた個数しか入力できなくないですか?



26: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:22:36.172 ID:W54ae4hn0.net
見たけど俺プログラム全然わからんかったわ



22: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:20:47.389 ID:jVlu6FHX0.net
これ、何をするコード?



28: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:23:36.556 ID:3mPqHcC90.net
>>22
とりあえず「名簿を作る」っていうプログラムを書きたくて
ファイル出力の部分はまだですが、入力の部分だけを書きました

このプログラムとしては
領域確保→情報入力→領域足りなければ確保→入力終了→入力内容出力



31: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:24:48.107 ID:Iagvg30P0.net
writeじゃなくてreadの方がしっくりくるのでread_profileとかに



32: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:25:26.366 ID:Za9eGAyc0.net
とにかくwriteって関数の名前を変えろ



24: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:22:14.231 ID:mDjiFfXY0.net
char name[256];
int age;
char sex[256];

参考書丸パク臭強すぎて続き見れなかった



38: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:29:10.028 ID:3mPqHcC90.net
関数名変えました
https://gist.github.com/anonymous/8534a3aea078e6fc5e75

>>24
配列が足りなくて終了するのが嫌だったので
とりあえず大きめに確保しました



45: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:38:46.476 ID:fIx1oOM+0.net
>>38
> 配列が足りなくて終了するのが嫌だったので
> とりあえず大きめに確保しました

scanf(" ", buf); みたいに最大文字数指定できるよ
でもそんならfgets使ったほうがいいよ



51: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:54:42.385 ID:3mPqHcC90.net
>>45
ありがとうございます
fgetsというのは初めての関数なのでちょっと使い方を
調べてみます



25: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:22:18.483 ID:X78XC3od0.net
mallocってそもそも必要時に確保するやつやろ
線形リスト構造にすればいい



38: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:29:10.028 ID:3mPqHcC90.net
>>25
領域2こづつ確保する様にしているのでこう書いたのですが
その線形リスト構造という方が良いでしょうか?



29: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:24:19.915 ID:fIx1oOM+0.net
sizeが2なのは何?



38: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:29:10.028 ID:3mPqHcC90.net
>>29
とりあえずちゃんと領域を想定通り確保出来るか知りたかったので
2こづつ確保するようにしています



30: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:24:23.187 ID:B1mN1Bm+0.net
異常終了はexit(0)で返さない方がいいんじゃない?



38: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:29:10.028 ID:3mPqHcC90.net
>>30
abortの方が良いという意味でしょうか?



44: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:37:25.221 ID:B1mN1Bm+0.net
>>38
exit(0);は正常終了



34: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:26:37.131 ID:5KFep5GX0.net
データをいちいちscanfで入れるんじゃなくファイルを読むようにした方が良いと思う



35: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:27:27.286 ID:OQP2ZtNAd.net
性別に256バイトもいらない



37: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:28:21.014 ID:fIx1oOM+0.net
>>35
ワロタ



42: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:30:54.516 ID:D18OD4lu0.net
最初のmallocいらねえなあ



47: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:41:25.329 ID:3mPqHcC90.net
>>42
malloc使わないとなるとどのようにして領域を確保しますか?



39: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:29:57.744 ID:3M6A0Ovnr.net
256文字以上入力されたらどうするのっと



47: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:41:25.329 ID:3mPqHcC90.net
>>39
それは想定外でした…
scanfで指定した以上の文字は切り捨てみたいな奴ありましたっけ…
考えます



46: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:40:51.153 ID:u/4RLTYJ0.net
↓のループのぬけ方が嫌いってか簡単に死ぬだろ

while(1){
printf("176人目の情報を入力して下さい。\n年齢に「-1」で終了。\n",i+1);
write(&profile[i]);
if(profile[i].age == -1){
printf("入力を終了します\n");
break;
}
i++;



51: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:54:42.385 ID:3mPqHcC90.net
>>46
手っ取り早い感じで抜け方を考えてしまったのですが…
まずいですかね



48: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:43:40.977 ID:D18OD4lu0.net
入力されるかわからないのに先に確保しなくてもいいじゃん



51: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:54:42.385 ID:3mPqHcC90.net
>>48
一応確保領域を使い切ってもまだ年齢に-1が入力されていなかったら
次の領域を確保って形にしているつもりなのですが



65: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 11:22:10.612 ID:u/4RLTYJ0.net
>>51
サンプル程度でとりあえず作りました~ってならいいけど
年齢に-1入れなきゃ簡単にsize以上アクセスして死ぬだろ



49: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:49:39.089 ID:6fsNBw9D0.net
性別も01で管理すればいいのに
イレギュラーなものぶち込まれると困るからな



51: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:54:42.385 ID:3mPqHcC90.net
>>49
イレギュラーな物入れられるのって本当に厄介なんですね…
つくづく思い知りました
管理は数字で出力の時に変換すればいいですね
有難うございます



43: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:31:22.775 ID:Iagvg30P0.net
インデックスがwhileループで使い回しされてて読みにくい
入力と出力をforループにして入力を抜けるときにcount=iとする方が良いと思うのだが



47: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:41:25.329 ID:3mPqHcC90.net
>>43
回数が決まった繰り返し→for
決まっていない繰り返し→while
が慣習と聞いたのですが、ケースバイケースでしょうか



52: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:55:54.541 ID:Iagvg30P0.net
>>47
iの初期化とインクリメントをプログラム中にばら撒くぐらいならforの後ろにまとめた方が見やすいだろ
for(i=0; ; i++) {
 read_profile;
 if (終了条件) {
  count = i;
  break;
 }
}
for (i=0; i < count; i++) {
 show_profile;
}



67: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 11:26:54.444 ID:3mPqHcC90.net
>>52
本当ですね! 
ただその場合今のままだと追加領域の確保が出来なそうですね
もうちょっと綺麗になる様に弄って見ます



53: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 10:57:56.155 ID:exkkuQ+D0.net
Cって制限厳しい記憶あったからプロトタイプ宣言せずに構造体の中に同名の構造体入れれたかなって素朴な疑問



59: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 11:05:45.853 ID:OQP2ZtNAd.net
>>53
リスト構造は広く使われてるし
少なくともvcとgccではいける



60: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 11:06:08.137 ID:L4f39ino0.net
一週間でこんなにできちゃうのか
すごいもんだな



61: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 11:09:21.749 ID:fIx1oOM+0.net
まあでも1週間でこれだけできてるんでしょ
焦らんでもここで指摘されてる問題ぐらいならすぐ自力でわかりそう



67: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 11:26:54.444 ID:3mPqHcC90.net
>>60-61
ありがとうございます
徐々に勉強していきます



62: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 11:13:57.010 ID:D18OD4lu0.net
二人しか入力したくないのにメモリは四人分確保されてるのは何で?
size++に直したとしてもデータは二人分なのにメモリは三人分あるのはなんで?



67: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 11:26:54.444 ID:3mPqHcC90.net
>>62
う… んー難しいですね
どうすればいいのかなぁ 
抜け方を変えるのが手っ取り早そうですね



63: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 11:17:39.187 ID:D18OD4lu0.net
ユーザーからの入力を受け取るメモリ領域といままで入力されたデータが同じメモリ領域にあるっていう作りが気に入らない
こういう作りは無駄を省いたとは言わない、手抜きっていうんだ



67: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 11:26:54.444 ID:3mPqHcC90.net
>>63
>ユーザーからの入力を受け取るメモリ領域といままで入力されたデータが同じメモリ領域にある
これはポインタを使ってるのがまずいという意味でしょうか?
あれ?すいません理解力が無い物で…



69: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 11:30:30.448 ID:D18OD4lu0.net
>>67
入力受け取りようと保存用と分けろってことだよ
ポインタを使ってるならどう作ればいいかわかるだろ



64: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 11:19:57.901 ID:R3rJXzUh0.net
一週間でここまでできればすごいと思う

そして配列要素数も指定できるようにすればいいと思うの



66: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 11:23:10.185 ID:R3rJXzUh0.net
あと人に見せるときはコメントつけてあげるといいよ



68: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 11:27:59.830 ID:I4/aNPGX0.net
realloc使うとデータ量が多くなったときに
大量のコピーが発生する可能性あるから
構造体のようなデータ型なら線形リストのほうが良いと思う
あと1週間でこれはすごいと思う
俺はポインタ1ヶ月くらい分からなかった



71: 以下、\(^o^)/でVIPがお送りします 2015/05/10(日) 11:36:11.173 ID:D18OD4lu0.net
mallocの返り値みてるのにreallocの返り値みてないのはなんで?
このへん直してから入力チェック作ったほうがいいね
http://viper.2ch.sc/test/read.cgi/news4vip/1431220107/
スポンサードリンク