1 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 06:14:52 ] C言語の入門者向け解説スレです。 ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 14 pc11.2ch.net/test/read.cgi/tech/1181735298/ 教えて欲しいのではなく丸投げしたいならこちらへ C/C++の宿題を片付けます 91代目 pc11.2ch.net/test/read.cgi/tech/1182607405/
369 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:42:12 ] forは式を省略できるがwhileは省略できない。 なので、無限ループはwhile (1) {...;}ではなくfor (;;) {...;}を使う。
370 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:47:09 ] もうしわけないです、コーディングは以下の理解でよいでしょうか。 だめ:× if (f=fopen(filename,"r")) よい:○ f=fopen(filename,"r"); if(f!=NULL)
371 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:47:14 ] >>367 malloc したら free しないとダメじゃん。 管理の手間が増えるからなるべくやりたくない。 必要な時はするがね。 ガベコレのある言語と一緒に考えない方がいいよ。
372 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:48:39 ] >>370 「だめ」ではなくて、「好ましくない」程度で。 他人が書いたものを読むときに、「だめ」と思わずに許容してあげましょう。
373 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:48:56 ] >>370 文法上の問題はないが推奨されない:△ if (f=fopen(filename,"r")) よい:○ f=fopen(filename,"r"); if(f!=NULL)
374 名前:デフォルトの名無しさん [2007/06/30(土) 11:50:26 ] whileでは無限ループはできないんですか?
375 名前:367 mailto:sage [2007/06/30(土) 11:54:14 ] >371 どもです。なるほど。確かにガベコレある言語でしかマジメに開発したことがないので、納得できていませんでした。 別物ですね。別物。 でも、その際に使用するMAX_BUF_NUMとかは一般的に1024とか使用されているのですが、何ゆえその数字が決まるのですか? 質問ばかりですいません。
376 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 12:07:15 ] 1KB程度でいいんじゃねって感じじゃね?
377 名前:367 mailto:sage [2007/06/30(土) 12:15:56 ] > 376 サンクス しかし、1KBにするか4KBにするかといったことに悩むんですよね。 作りたいアプリの仕様が1KB程度だから、ここは1KBにするか、と考えるのは普通のような気もするのですが、 アプリを作りたいのではなくて、自分用の便利ライブラリを作成する際にどの数字を採用するか、 と考えるのが非常につらい。 つか、こんな考え方の俺ってガベコレ言語を使いすぎですか。
378 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 12:20:37 ] ライブラリならバッファの大きさなんてユーザから指定を受け付けるものに決まっているだろ。
379 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 12:23:07 ] C が嫌なら C++ で string とか vector とか使えばいいよ。
380 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 12:23:59 ] >>369 for(;;) は可読性が乏しいから while(1) の方が好きだな。
381 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 12:25:18 ] >>372 373 ありがとうございました。
382 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 12:33:22 ] >>377 Cでライブラリ作るときは内部でバッファを抱えない。 (char *buf, size_t bufsize) で受けるのがお約束。 高級にやりたいならmalloc, freeでやってバッファがあふれたらreallocで拡張。 手を抜きたいなら#defineで固定バッファであふれたらASSERTでとめるか放置してバッファオーバーフロー。 大体この三種類だな。重要度とパフォーマンスを秤にかけて好きにしとけ。 1kbと4kbのどっちが妥当かなんて答えようがない。
383 名前:367 mailto:sage [2007/06/30(土) 12:45:56 ] >> 382, 379, 378 どうもありがとうございました。 後は、自分で考えることができそうです。 ついでにもう一つ聞いてもいいですか? 文字列の配列を作るときに、 ダブルポインタを採用するのがいいか、リンクリストを採用するのがいいか迷っています。 どちらがお勧めですか?
384 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 12:48:35 ] それは定数か? それとも実行中に作りたいのか?
385 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 12:50:49 ] >>383 使い方によるだろ よくわからないならダブルポインタの方が扱いやすいかな?
386 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 12:55:20 ] リストなんて糞なもん使わずにchar**な配列作っとけ
387 名前:367 mailto:sage [2007/06/30(土) 13:02:55 ] >>385 , 384 ありがとうございます。 構造体でどちらで定義しようかな、と考えていました。 typedef struct { char *dstr; int dlen; } DATUM; typedef struct { DATUM *ptr; int size; } DATUMLIST; とするか、 typedef struct _DATUMLIST { char *dstr; char dlen; struct _DATUMLIST *next; } DATUMLIST; とするか迷っていたのです。まぁ、迷わずに実装してしまえば、どちらでもいいような気がしますが。
388 名前:367 mailto:sage [2007/06/30(土) 13:06:07 ] >>386 それも考えました。 無駄に考えるのがよくないのですかね。 この際、char**な配列の方が楽のような気がしてきた。
389 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 14:08:33 ] int型を指すポインタ int* p; 一次元ポインタ配列 int** p; 二次元ポインタ配列 int*** p; 三次元ポインタ配列 int**** p; って風にスターを増やしていってもいいの?
390 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 14:09:42 ] #include <stdio.h> int multiple(int, int); main() { } int multiple(int x, int y) { if(y%x == 0) return 1; else return 0; } multiple関数を使って二つの整数を比較し 二つ目の整数が一つ目の整数なら1(真)、 それ以外なら2(偽)を返すというプログラムを作りたいのですが main関数をどうすればいいのかわかりません
391 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 14:11:44 ] >>389 int** p; は int* 型を指すポインタだ。 それが必要になれば使う。普通に使う。
392 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 14:12:34 ] >>390 main 関数で何がしたいのか分からないので こちらにもどうすればいいのか分かりません。
393 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 14:14:28 ] >>389 スターじゃなくてアスタリスクじゃね?
394 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 14:16:08 ] 普通にどちらも使う。 フォントによっては実際に星型なってることもあるし。
395 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 14:16:22 ] >>391 ありがとう >>390 if(y%x == 0) ってyに0が入ってきたらy%xは必ず0になって比較にならないんじゃね?
396 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 14:20:45 ] >>395 0 はあらゆる数の倍数(0 倍)だから動作的に問題ない。
397 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 14:23:12 ] xが0の時のほうがまずいよな。
398 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 14:30:47 ] まあ、どこまでエラー処理するかは状況次第だな。 assert するだけにしておくか、 それともエラー時に何か特別な処理をしてエラー復帰するか。
399 名前:390 mailto:sage [2007/06/30(土) 15:24:33 ] main関数では、変数を二つスキャンして それをmultiple関数に渡し、multipleでの結果を main関数に返してプリント というふうにしたいです
400 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 15:27:56 ] そう書けばいいんじゃないかな。
401 名前:390 mailto:sage [2007/06/30(土) 16:26:43 ] その書き方がわからなくて困ってます
402 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 16:30:21 ] そうですか。
403 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 16:30:50 ] エラー出てもいいからとりあえず書いてみれ。 それでも分からなければ、 自分でどうやってみたかをここにコピペしてみれ。
404 名前:390 mailto:sage [2007/06/30(土) 17:12:58 ] どうしてこんなにお願いしているのに教えてくれないんですか。 もったいぶらないで今すぐに教えてください。
405 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 17:20:13 ] #include <stdio.h> int multiple(int, int); int main(void) { int x, y; scanf("%d %d",&x,&y); if(x == 0) return 1; printf("%d\n",multiple(x,y)); return 0; } int multiple(int x, int y) { return (y%x!=0)+1; } 二つ目の整数が一つ目の倍数なら1 と解釈してやってみた つかここ宿題スレだっけ?
406 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 17:20:22 ] うわ・・・
407 名前:390 mailto:sage [2007/06/30(土) 17:21:03 ] #include <stdio.h> int multiple(int, int); main() { int a,b; scanf("%d%d\n", &a, &b); printf("%d\n", multiple(a,b)); return 0; } int multiple(int x, int y) { if(y%x == 0) return 1; else return 0; } このプログラムだと一応実行できるのですが 整数を二つ入力しても動かず、もう一つてきとうに整数を入れると 最初の二つの整数について判断します。 例えば 2 4←ここで4は2の倍数なので1が返ってくる はずなのですがそこでは処理がされず 5←さらに適当に整数を入力する 1←すると結果が返ってくる と、こんな感じです 整数を二つ入力した時点で処理結果を返したいのですが いいでしょうか?
408 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 17:22:14 ] >>404 >main関数をどうすればいいのかわかりません >というふうにしたいです >その書き方がわからなくて困ってます 一度もお願いなんかされてないんだが。
409 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 17:25:25 ] >>408 行間も読めないんですか? とか言われそうだなw >>407 scanf()とprintf()のフォーマット文字列は互換性がないと思ったほうがいい。 あんたのコードは明らかにscanf()のフォーマット文字列が間違っているぞ。
410 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 17:26:28 ] >>409 お前こそ行間が読めてないなw
411 名前:409 mailto:sage [2007/06/30(土) 17:30:06 ] >>410 大丈夫、初めから読もうとしてないから。
412 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 17:37:36 ] これはひどい
413 名前:390 mailto:sage [2007/06/30(土) 17:43:19 ] >>409 助言ありがとうございます それと404は私ではないのであしからず
414 名前:390 mailto:sage [2007/06/30(土) 17:57:37 ] main() { int a,b; printf("整数1:"); scanf("%d", &a); printf("整数2:"); scanf("%d", &b); printf("%d\n", multiple(a,b)); return 0; } 407のmain部分を上のようにしたら理想通りに実行されたのですが なぜ上手くいったのかがよくわかりません。 誰かその理由を説明してください。
415 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 17:59:15 ] >>414 >>409 の最後の行
416 名前:390 mailto:sage [2007/06/30(土) 18:02:29 ] 間違っていることはわかりましたが 407のscanf()はどういけないんですか?
417 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 18:02:51 ] \n
418 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 18:03:23 ] >>416 \n
419 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 21:07:21 ] もし A、B、C、Dのいずれかを満たしたら、、、と出力 それ以外なら。。。と出力 とするにはどうやればいいですかね?
420 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 21:20:02 ] >>419 ですけど自己解決しますたー
421 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 23:23:30 ] #include<stdio.h> #include<string.h> main(){ char c[3]; char s1[]="abcdefghijklmnopqrstuvwxyz" char s2 [100]; s2[0]='\0'; printf("s1 inital value:\"%s\"\n",s1) printf("s2 inital value:\"%s\"\n",s2) if cstrcmp(s1,s2)==0){ printf("s1==s2\n");} else{printf("s!=s2\n");} printf("Push ENTER to proceed."); fgets(c,2,stdin); strcpy(s2,s1); printf("s1 current value:\"%s\"\n",s1); printf("s2 current value:\"%s\"\n",s2); if(strcmp(s1,s2)==0) { printf("s1==s2\n");} else{prinf("s1!=s2\n");} } のプログラムのfgets(c,2,stdin); ってなんですか?なんの役割ですか?
422 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 23:29:26 ] >>421 どうでもいいけどそれ、そろそろtypo直そうな × if cstrcmp(s1,s2)==0){ ○ if (strcmp(s1,s2)==0){
423 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 23:29:57 ] pc11.2ch.net/test/read.cgi/tech/1182607405/607-644 解決したんじゃなかったのか
424 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 23:34:01 ] fgets(c,2,stdin); がわかないんですよ タイプミスはすいません
425 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 23:37:27 ] >>421 stdinからcに1文字読み込む。
426 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 23:38:03 ] 流れも他スレも読まずに回答。 >>421 >のプログラムのfgets(c,2,stdin); ってなんですか?なんの役割ですか? 入力処理。改行を入力させるために使っているわけだ。
427 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 23:41:15 ] >>424 Push ENTER to proceed を表示したところで止まるだろう エンターキーを押すと次に進む ようはポーズさせているんだろう
428 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 23:42:16 ] >>428 なんでENTERを押すと次が表示されるんでしょうか?
429 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 23:44:23 ] >>428 自己レスかよ fgets(c,2,stdin); で標準入力からの入力待ちで止まっている エンターキーで入力されたので次に進むだけ cのデータ自体はいらないもの
430 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 23:51:30 ] わかりました。ありがとうございます
431 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 00:54:39 ] プログラムとか全くなんにもやった事ないんですけど、最初になにを用意したらいいものなんでしょう? ここのサイトをまず読めとか入門にいい本とかってありませんかね? 仕事では2D/3Dのデザイン系やってるんですけど、プログラムにもちょっと興味があるんで、 まずはCから勉強していこうと思っているんですが。
432 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 00:55:43 ] まず、コンパイラとリンカを用意します
433 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 00:57:21 ] 最初に用意すべきものは、 何を用意すればいいかを自力で探せる能力だな とマジレス いや、マジでプログラマにとって最重要な能力は、情報収集力だよ
434 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 01:00:07 ] もうちょい広範囲に言うと「自己解決能力」
435 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 01:02:58 ] 応用力。>>428 なんかは将来心配
436 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 01:10:50 ] 俺も>>431 に何かレスしようと思ったが >>433-434 に全て持っていかれた
437 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 01:11:17 ] やる気。
438 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 01:12:20 ] やる気は大切だが、やる気だけの子も困ったり。
439 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 01:13:12 ] 叩かれても泣かない。むしろ悦ぶ方向で。
440 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 01:15:15 ] 四大欲求をフルに使いこなせる体力。
441 名前:431 mailto:sage [2007/07/01(日) 01:16:58 ] そうっすねぇまずは色々情報探してみます。 入門出来たらまた相手にしてください。
442 名前:デフォルトの名無しさん [2007/07/01(日) 01:56:16 ] #include <stdio.h> int main(void) { int min,max,x,y,i,j; puts("長方形を作りましょう"); printf("一辺(その1)"); scanf("%d",x); printf("一辺(その2)"); scanf("%d",y); min = x; if (y < x) min = y; max = y; if (y < x) max = x; for (i=1; i<=max; i++) { for (j=1; j<=min; j++) putchar('*'); putchar('\n'); } return 0; } 何がおかしいスかねぇ *が表示されないんですよねぇ
443 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 01:59:59 ] >>442 printf("一辺(その1)"); scanf("%d",&x); < & が抜けてるよ printf("一辺(その2)"); scanf("%d",&y);
444 名前:デフォルトの名無しさん [2007/07/01(日) 02:04:09 ] あ なんということ…ありがとうございます
445 名前:デフォルトの名無しさん [2007/07/01(日) 02:08:54 ] ちなみにこのプログラムは順番的には for (i=1; i<=min; i++)→for (j=1; j<=max; j++)→putchar('*') →for (j=1; j<=max; j++)→putchar('*')→for (j=1; j<=max; j++)→putchar('*') …→putchar('\n')→for (i=1; i<=min; i++)→… みたいな感じで実行されてるのですか?
446 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 02:20:10 ] >>445 それであってるよ。実行して確認してみればいい。
447 名前:デフォルトの名無しさん [2007/07/01(日) 13:00:50 ] >>446 ありがとうございました
448 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:37:35 ] 四大欲求とは三大欲求に知的探究心を加えたものか
449 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:45:08 ] ノッてくれ〜Ha〜Ha〜♪
450 名前:449 mailto:sage [2007/07/01(日) 14:45:40 ] 素で誤爆しました すみません
451 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:51:42 ] Gnuplotを扱うC言語用のライブラリとか無いでしょうか? popen()関数を使って自分で作る事は出来るのですが もし優れたライブラリがあるならそっちを使いたいです C++では駄目でCでおながいします
452 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:06:59 ] 例えば foo(cahr*p) { char *my_ptr = MyGetInnerParameter("内部パラメータを文字列で返す関数"); strcpy(p,my_ptr); } var() { char *ptr; foo(ptr); } こうすると、落ちるんだけど、どうして?
453 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:09:22 ] foo(char** p) にしないと
454 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:15:07 ] いやそれ以前のはなしか
455 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:21:54 ] どこ指してるかわからないpにstrcpyしちゃだめだろ
456 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:23:24 ] char* a[8]をlongに直すにはどうしたらいいでしょうか? >>で1つずつやっていくしかないですかね?
457 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:25:03 ] じゃあ foo(cahr*p) { char *my_ptr = MyGetInnerParameter("内部パラメータを文字列で返す関数"); strcpy(p,my_ptr); } var() { char ptr[8]; foo(ptr); } こうしてみたんだけど、やっぱりダメだった。 どうして?
458 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:25:29 ] cahr
459 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:28:38 ] >>458 そういうケアレスミスは置いといて^^
460 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:30:00 ] コードを見る限り問題はなさそうな気がする。 MyGet(ryの戻り値がおかしいんじゃないのか。 戻り値になるバッファをスタックに取ってるとか。
461 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:31:06 ] コピーされる文字数が1024バイトだったとかってオチだろ。
462 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:37:26 ] デバッグとしてmy_ptr表示させてみたりとか、自分でしないの?
463 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:41:43 ] そもそも、呼ぶ側で領域確保が必要な関数の場合、 最初に用意する容量を問い合わせてから領域を確保して初めて呼び出せるんだろうに。 領域サイズの確認関数が無いなら、十分なサイズを用意してあげないとダメ。 そして、サイズに満たない領域にコピーしちゃダメ。
464 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 21:38:52 ] bregexp.dllのラッパーライブラリ内ですか?
465 名前:デフォルトの名無しさん [2007/07/01(日) 22:45:56 ] サブ関数内でmalloc()でメモリ確保した領域ってメイン関数に帰るときに解放されないの?
466 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 22:46:46 ] >>465 free()かrealloc()で解放しない限り、されません。
467 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 22:50:23 ] >>465 解放されると困らないかい? malloc() 〜 free() の作法としては、使う人が確保と解放の責任を持つって暗黙のルールなんだけど、サービス関数の中には、確保だけして解放は使う側でやってね。なんてローカルルールもあるしな。 解放されると思い込むくらいなら、仕様確認をした方がいいよ。
468 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 22:56:05 ] >>465 自動変数とごっちゃになってない?
469 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:14:22 ] alloca なら開放されるな。 環境依存だが。