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/
285 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 01:12:54 ] て・・・定石なんてないのさ
286 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 01:23:21 ] テキストファイルをよみこんでたとえばファイルに cccchaa というのがかいてあったら下のような感じで画面に表示したいんですけど どんなソースコードですかね?アルゴリズムがピンとこないのでお願いします。 c→4 h→1 a→2 #include <stdio.h> int main(void){ FILE *fp,*fut; char sfn[80]; char yomi[256],mawasi[256]; int i; scanf("%s",sfn); if((fin=fopen(sfn,"r"))==NULL)return -1; fout=fopen("comp","w"); i=0; while((yomi[i]=fgetc(sfn))!='\0'){ i++; } fclose(fp); fclose(fut); return 0; }
287 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 01:29:15 ] ・読んだ文字が前回と異なっていたら カウンタをリセット(0にする)。読んだ文字を覚えておき、カウンタをインクリメント ・読んだ文字が前回と同じならそのままカウンタをインクリメント
288 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 02:33:50 ] >>281 10101 (10進数で21)の時点で既に違うんだが。 一般的には、>>273 が正解 もうこの話題終わってるけどね
289 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 03:16:46 ] 構造体のint型の要素と、構造体外のchar型の変数とstrcmpで比較したいのですが int型の要素をどうchar型に変換するのかわかりません。 何か良い方法はありますか?変換は逆でも構いません。
290 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 03:18:17 ] atoi とか sprintf とか
291 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 03:24:59 ] 先日C言語の勉強をしていたら以下のプログラムがありました。 なんで、プログラムを実行して、この結果が出てくるのか全く わかりません。プログラムの結果がなぜそうなるのか内容を出 来るだけ詳しく教えてください。初心者なのでなるべく丁寧に お願いします。もし、プログラムのタイプミスがあったらすい ません。 #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");} }
292 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 03:48:27 ] この結果ってどの結果
293 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 05:51:18 ] 「この」結果
294 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 06:07:23 ] sayonara
295 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 07:43:16 ] さよならbyebye〜元気でいてね 年に二回くらいのクソレスならキャッチするよ〜
296 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 09:46:49 ] 2の倍数はある数を2倍したもの 2倍するとは、2進数だと左に1ビットシフトしたもの ゆえに、一番下のビットは必ず0になる。 3の倍数もこれに習ってやってみ。
297 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 10:40:10 ] 291です なんでENTERを押すと次の実行結果が表示されるのな何でですか? ↑のも質問ですがこのような感じの内容を教えてください
298 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 10:56:41 ] >>297 s1 inital value:"abcdefghijklmnopqrstuvwxyz" s2 inital value:"" s!=s2 Push ENTER to proceed. s1 current value:"abcdefghijklmnopqrstuvwxyz" s2 current value:"abcdefghijklmnopqrstuvwxyz" s1==s2 これのどこがわからないの
299 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 11:56:31 ] >>291 stdio.h には、C標準ライブラリのコンソール出力関数のプロトタイプ宣言があり、 そこで宣言されているprintfを使っているから、結果が出力されるんです。
300 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 12:32:32 ] >>291 学生?俺もだけど 何の関数を使うためにstring.hをインクルードしているか? strcmp(),strcpy関数はどういう関数か? fgetsはどういう関数か? を調べればたぶんわかると思うよ。 if構文とか'\0'とかprintf()とかエスケープ文字とか 文の終わりに;をつけるとか(付け忘れが多すぎたからあえて指摘) くらいは知っているだろうし、人にきくほど難しいものではないとおもう。
301 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 12:43:42 ] >>291 >char c[3]; >fgets(c,2,stdin); こんな阿呆なコード、誰が書いたんだ?
302 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 12:46:17 ] 本質的じゃないトコにつっこむのもなんだかなー
303 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 13:11:38 ] だって、阿呆なんですもの
304 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 14:09:38 ] その程度のことを見つけてアホアホ得意気になる香具師は痛々しい。
305 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 14:21:40 ] まあ、fgets のサイズ指定は ヌルターミネータ込みのバッファサイズを指定することくらいは ちゃんと知っておいた方がいいとは思う。
306 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 14:32:10 ] しぜおf使おうぜ?
307 名前:デフォルトの名無しさん [2007/06/29(金) 17:55:27 ] #include <stdio.h> int main(void) { int x,y,z,s; printf("何cmから:"); scanf("%d",&x); printf("何cmまで:"); scanf("%d",&y); printf("何cmごと:"); scanf("%d",&z); s = (x - 100)*0.9; x = x + z; for (; x <= y; s) printf("%dcm %.2fkg\n",x ,(double)s); return 0; } これだと x+5 についての場合のみ永久にブァーッと出てきます。 x〜yの範囲内にするにはどうしたらいいですか?
308 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 18:02:10 ] for (; x <= y; x += z) { double s = (x - 100) * 0.9; printf("%d cm %.2f kg\n", x, s); }
309 名前:デフォルトの名無しさん [2007/06/29(金) 18:12:13 ] >>308 ありがとうございました。 この場合繰り返しが行われてる式は x += z と double s =(x - 100)*0.9 と printf("%dcm %.2fkg\n",x,s) の3つですよね?繰り返したい式が2つ以上あるときは forの()の中に1つ書いて、()を閉じてから残りの繰り返したい式を書くということでいいんですか?
310 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 18:14:42 ] procedure a: Integer var int C; beigin a := 0; end; がうまくイカなんだがなんだろ
311 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 18:22:01 ] beigin → begin つーかこれPASCAL・・・
312 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 18:44:38 ] Pascal って人間は考える葦とかいっていた人か?
313 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 18:47:07 ] さつま芋とか水で洗って食う動物じゃね?
314 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 18:52:22 ] int* p; /*ポインタのデータ*/ int a = b/*p; /*b÷(pの先のデータ)→a*/; 割り算ができね
315 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 18:53:22 ] アライグマパスカル、うが
316 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 18:53:39 ] / と * の間に空白開ければいいじゃん。
317 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 18:55:18 ] 今でも、糞つまんないCPUのロジックは大方割り算なのは確かだw
318 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 19:24:53 ] 今までで、プログラムって訳に起つよな(^^って思えたのは perlとrubyとMLとエクセルで使うVBAくらい。 C++とかJavaは嫌な思いしかさせてくれない。
319 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 19:32:41 ] で、Cはどこ?
320 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 19:34:11 ] here
321 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 19:38:48 ] Cは昔のアセンブラみたいなもん。 良いも悪いもない
322 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 20:28:23 ] ガウシアンフィルタを作りたいんですが、質問させてください フィルタをかけたい画素を中心に3×3のマスクをつくるとします。 teo.sourceforge.jp/doc/TeoProgrammingGuide/img/gaussian_kernel2.png みたいなガウシアンフィルタを作って、この行列の各要素の数値を マスクの行列の同じ場所の画素値にかけて、 その合計で中心画素の値を割ればいいんですか? マスクがとしたら 1 3 3 4 6 2 1 2 3 1×0.07 + 3×0.12+・・・+3×0.07=SUM 6/SUMがフィルタをかけた後の値ですか?
323 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 20:32:30 ] >>321 アセンブラに昔も今もあるのかよ
324 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 20:38:06 ] >>323 Cの話でしょ?w
325 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:52:45 ] >>322 そうだと思うけど、まずはやってみればいいんでね?
326 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 22:33:26 ] >>322 そのコーディング方法が分からないんで無ければ 画像処理スレかどっかで聞いた方がいいんでね?
327 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 00:14:23 ] 最近ちょっとさわり始めたのですが、 memcpyのように引数にvoid*をとるとき、どうやってvoid*の中の物を 取り出すんですか?普通に配列のように[0]とかってやってもエラーになるし…
328 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 00:14:47 ] 適当なポインタ型にキャストすればいい。
329 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 00:48:34 ] >>328 その場合、中身が構造体などの場合にはどうしたらいいんでしょうか? char*などにキャストした後から戻せるのでしょうか?
330 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 00:54:00 ] 構造体でキャストすればいいんじゃ
331 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 00:57:58 ] >>330 該当する構造体でキャストすればいいのはわかるのですが、 memcpyのようになんでもコピーできるようにするにはどうしたら いいのかなと思ったのですが、これはあまりmemcpyを 使わない方がいいと言われるのと何か関係があるのでしょうか?
332 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 01:01:30 ] そんなもんchar*にキャストして1バイトずつ読み書きしているだけと思っていればいい。 実際には高速化するため複数バイトずつ読み書きするなど工夫しているいるけど。
333 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 01:51:53 ] >>332 参考になりました! ありがとうございます。
334 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 02:08:51 ] まぁ、間違っても構造体のコピーにmemcpy()なんて使うなよ。
335 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 02:09:15 ] 表示した画像を消すときはどんな関数を使いますか?
336 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 02:11:56 ] CLS 3
337 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 02:15:50 ] >>336 それってBASICじゃないですかw
338 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 02:18:01 ] あ、Cで表示した画像を消すときはどんな関数を使いますか?
339 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 02:20:43 ] 画像を表示するのにどんな関数使ってますか?
340 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 02:21:15 ] >>338 真っ白な画像を用意して、消したい画像の代わりに表示してはいかがでしょう。
341 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 02:35:45 ] もはやCのスレではなくなったな
342 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 03:05:44 ] exit(1);
343 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 03:36:59 ] goto >>343 ;
344 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 07:38:21 ] 教えてください。 main関数から、ある関数に引数を渡す場合は、次のような 感じで渡してもOKですか?ダメみたいなんすが、その理由が わからないです。 もちろん、実行する場合は引数を指定します。 a.out A.txt のように。 extern int p(char *filename) int main(int argc, char*argv[]) { p(argv[1]); }
345 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 07:41:09 ] &argv[1] argv
346 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 07:51:38 ] >>344 どうダメなの? それでいけると思うのだけど。 >>345 プロトタイプ宣言と型が合いません。
347 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 07:52:44 ] 単にダメって言うんじゃなくて具体的にどんなエラーがでたとかさ・・・
348 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 07:58:13 ] パス指定なしのファイル名だけ書いていて、起動ディレクトリと違うところにあって見つからないとか。
349 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 08:04:09 ] 申し訳ないです。 セグメンテンションフォルトです。
350 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 08:09:50 ] 問題があるのはp()の方だろ
351 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 08:13:32 ] >>350 なるほど、呼び出す先のp関数がわるのかなぁ。 引数でわたってきたファイル名をfopen()を呼んでいるだけなんですが。
352 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 08:19:35 ] 微妙に日本語がおかしいのが気になる
353 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 08:21:27 ] どうもあがとうございました。 呼び出す先のp関数が悪いみたいです。 if (f=fopen(filename,"f")) "f" -> "r" ですね。すいませんでした。 このようなif文で代入はOKなのかなぁ?
354 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 09:05:16 ] >>353 間違ってはいないがお勧めしない。 Cのエキスパートを自称するロートルは、しばしば「代入と比較を一行で書けるのがCらしさだ」とのたまうが、 バグの混入の原因になりかねないし、第一必ずしも読み易くない。
355 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 10:55:48 ] ifの中で代入すると大抵警告が表示されるしな。 if ((f = fopen()) != NULL)とするやつもいるが俺は好きになれない。
356 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:02:07 ] 80カラムに収まるならついやっちゃうな・・・ f=NULL; f=fopen("ようじょ", "w"); if(f==NULL){ puts("ひゃぅん?"); } ここまでするとクドイ感じもするが・・・
357 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:03:31 ] fopenって失敗したらNULL返すんだからf=NULL;は要らなくね?
358 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:14:05 ] 我が家ではこうしてますね・・・ 基本的に使う前と使った後はクドクドと初期化
359 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:17:27 ] よくこういうふうにやる FILE* fp = fopen(); if (f)
360 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:20:07 ] FILE* fp; FILE *fp; この二つの違いって何かあるの? 単なるコーディング流儀の違い?
361 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:22:46 ] 流儀の違い
362 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:22:50 ] そう、流儀の違い。 構文上は、FILE*fp;もFILE * fp;も可能。
363 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:23:41 ] FILE * fp ; だっていいZE
364 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:23:58 ] >>360 前者はC++使いに多く、後者はC使いに多い。 両方使う私は、だからと言うわけではないがFILE * fp = fopen(...);と書く。
365 名前:デフォルトの名無しさん [2007/06/30(土) 11:33:59 ] for文とwhile文の明確な違いって何ですか? たとえばfor文ではできるけどwhile文ではできないこととか・・・。
366 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:38:13 ] continue 時にも for(A;B;C) の C が実行されるってのが while だと実現が面倒。
367 名前:デフォルトの名無しさん [2007/06/30(土) 11:41:46 ] バッファの割当の数とか数字を#defineしてしまうのは、なぜですか?マジックナンバーを使いたくないのはわかるのですが、 その都度malloc、もしくはreallocしてはいけないのですか? または、そのバッファの割当の数はどうやって決まるのですか? どうもCを書いていると全部mallocしたくなるのですが、C言語のハッカーさん教えてください。
368 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:41:58 ] for文の括弧内の式はどれも省略可能。 while文の括弧内の式は省略不可能。
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 使い方によるだろ よくわからないならダブルポインタの方が扱いやすいかな?