1 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 12:49:22 ] C言語の入門者向け解説スレです。 ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 22 pc11.2ch.net/test/read.cgi/tech/1196489491/ 教えて欲しいのではなく丸投げしたいならこちらへ C/C++の宿題を片付けます 101 pc11.2ch.net/test/read.cgi/tech/1197132472/
413 名前:デフォルトの名無しさん [2007/12/30(日) 21:51:23 ] すみません、質問させてください。 テキストファイルを作ると同時にそのファイルから文字を読み込んで出力する・・というのをやりたいのですが、なぜか開こうとしてもすぐ画面が消えます。なにがいけないんでしょうか? 別に読み込むだけでもいいのでアドバイスお願いします。コンパイラは「Bloodshed Deb-C++」です。
414 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:52:39 ] 改行が多すぎると言われたのでいくつかに分けて書きます。 #include <stdio.h> #include <stdlib.h> void kaku(int,int*,char*); int main(int argc, char *argv[]) { int ten=0; char kekka[]="NG"; kaku(1,NULL,NULL); kaku(2,&ten,kekka); kaku(3,NULL,NULL);
415 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:53:27 ] FILE *fp; char data[256]; fp=fopen("test,txt","r"); fscanf(fp,"%s",data); fclose(fp); printf("%s\n",data); system("PAUSE"); return 0; } void kaku(int fg,int *ten,char *kekka) { static FILE*f; switch(fg){ case 1: f=fopen("test.txt","w"); break; case 2: fprintf(f,"%d点,",*ten); fprintf(f,"%s\n",kekka); break; case 3: fclose(f); break; } } です。長々とすみません
416 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:59:38 ] >>412 pointer to pointerを作るなら a = (double**)malloc(size*sizeof(double*)); じゃないの? まあ、メモリは余分に確保されてるからコーディング間違えなければちゃんと動くだろうけど。 >>413 意味が分からない
417 名前:416 mailto:sage [2007/12/30(日) 22:01:23 ] ああ、>>413 は>>414-415 か
418 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 22:06:43 ] >>416 printf("%d\n", sizeof(double)); printf("%d\n", sizeof(double *)); で確認した所、 double型が8で、double *型が4でした。 ポインタだと値が違うんですね。 始めて知りましたorz 通りで動かなかったのかと・・・ ありがとうございました。 頑張ってみます
419 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 22:16:23 ] >>413-415 13行目はtest,txtじゃなくてtest.txtだろう。 fopenしたならfpがNULLかどうか必ず確認すべきだ。 system("PAUSE")というのは俺の環境にはなかったから外したら多分期待通り動いた。
420 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 22:37:38 ] >>419 できました!ありがとうございます!!
421 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 01:54:34 ] >>418 ついでにcharとchar *、shortとshort *とかもsizeofして見比べて見ると良いよ ポインタがちょっと見えて来る
422 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 01:55:08 ] テキストファイルからある文字列を検索し、ヒットした文字列の直後にある数値を抜き出すコードを考えています 例えば X= 630.20 Y= 220.20 Z= 33.25 A= 30.25 のような感じです。このうちプログラム内で定数として用いたいのが630.20や220.20、33.25に30.25です まず1行目をfgets()でポインタ*fpに読み込んで、"X="をstrstr()で探します その辺りまでしかぱっと思いつきません ここから630.20を読み込もうと思うと、どのような方法があるでしょうか 宜しくお願いします
423 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 01:56:18 ] scanf
424 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:01:46 ] >>423 ありがとうございます ですが、scanfはキーボードから入力したデータを読み込む奴ですよね? テキストファイルに書いてあるものを読み込みたいのですが…
425 名前:デフォルトの名無しさん [2007/12/31(月) 02:15:45 ] isdigit() 一文字ずつで調べて配列に格納して、atof() とか トークンがスペースなら、そこまで読み込むようにして、 atof() とか トークンをもう少し考えなおすのがいいかも、セミコロン、カンマとかにする。 strtokn()とかあった気がするが、それは調べてくれ。
426 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:22:41 ] >>424 fscanf
427 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:24:37 ] >>425 変なこと教えるなよ。 atofは数字以外に当たったら解析を終了するから、 > 一文字ずつで調べて とかは不必要だろ。
428 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:29:10 ] >>425 ありがとうございます。isdigitでチェックして配列に格納が簡単そうですね strtokn()もありますけど、元ファイルを変換する(というより、別ファイルを作ってそこに数値同士をカンマ等で区切るようにする?)ので、あまり使いたくないところです 最悪、strtokn()で別ファイルを一時ファイルとして作成してやるという方法がありますが… ちょっと考えてみます。ありがとうございました >>426 fscanfにそんな機能があったのですか、もう一回調べてきます ありがとうございました
429 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:54:39 ] >>428 scanfはfscanfのラッパー関数みたいなもん。 scanf内でfscanfをstdinに対して処理している。 scanfでもstdinをfreopenすればファイルからの入力にできる。
430 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 09:13:36 ] 普通strtol(), strtod()
431 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 09:43:21 ] #include<stdio.h> int main () { int a,b,c,i,f,d[50]; scanf("%d %d",&a,b); switch(a*b){ case 0: return 0; defalt: c=a/b; printf("%d",c); /*19*/ break; } i=1; while(i<=50){ c=a%b; d[i]=c/b; c=c%b; printf("%d",d[i]); if(d[i]==0) f++; else f=0; if(f>=2) break; i++; } return 0; } スミマセン!なんでコレダメなのデスカ?オシエテクダサイ!!!
432 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 09:45:12 ] >>431 scanf("%d %d",&a,&b); 反射神経が書いてるので違うかもシレン。
433 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 10:26:48 ] >>431 defalt: ↑これがだめだ。 ラベルとして認識しているはず。 default: な。
434 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 10:28:32 ] >>431 ちょっとずれるが、 switch(a*b){ case 0: ↑0かどうか判断したいだけなら、if文を使うべきだ。 switchにする必要なし。
435 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 12:42:18 ] スミマセンちなみにエラーの内容ハ”Ifに(がナイ”デス。 修正しまシタがダメデス。 書き方ノドンクササとかよりそっち教えてホシイデス。
436 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 13:03:01 ] >>431 に「エラー」は見当たらないような・・・
437 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 13:18:59 ] >>435 もう一回、ifの入ってるバージョンのソース見せてくれたらなにかコメントできるかも
438 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 13:22:45 ] >>431 >d[50]; >i=1; >while(i<=50){ これも駄目だな
439 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 14:25:34 ] 437 このトウリデス ナオラネエ!ウガァァァァァ
440 名前:デフォルトの名無しさん [2007/12/31(月) 17:09:50 ] #include <stdio.h> void test(int i); itn main(void) { test(0); return 0; } void test(int i) { if(i<10){ test(i+1); printf("%d",i); } } 再帰なんですが これ難しくて理解できないんすよ。 みなさん詳しく説明してくださいお願いします。
441 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 17:41:00 ] test関数は引数が10未満ならもう一度test関数を引数+1の値を使って呼び出したあと引数を出力する。 出力は「9876543210」ってなるだけかな? 10を3とかにして流れをゆっくり追って行けばわかるよ。
442 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 17:42:04 ] itnってなんだろうってのは置いといて、 test(0)は0+1でtest(1)を呼ぶ test(1)は1+1でtest(2)を呼ぶ 最終的にtest(9)が9+1でtest(10)を呼ぶが、i<10じゃなくなるので何もしない その後printfで9が印字され、8が印字され・・・最初の0が印字されて終了と 処理が戻っていく感じだな
443 名前:440 [2007/12/31(月) 18:03:00 ] >>441 >>442 やっぱ再帰できたほうがいいすか? ポインタよりも再帰の方が難しい・・・
444 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:04:52 ] 何が難しいのかさっぱり理解できない
445 名前:440 [2007/12/31(月) 18:11:48 ] 何故、0123456789じゃなくて 逆になるのかが、難しい
446 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:13:21 ] >>443 感覚的に理解できないだけだと思うけど、 デバッガでステップ実行して追っていけばわかると思うよ。 ちなみに、再帰はめったに使わない。 11年ぐらい仕事でCプログラミングやってるが、 再帰を使ったのは1,2回。
447 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:23:52 ] >>445 printfを実行するのはtestを実行した後だから ディレクトリの走査とかそれに類似したものは再帰使うなぁ 定番というか
448 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:30:32 ] デバッグ中に無限に再帰してスタック食いつぶしてデバッガがフリーズするのも良い思い出。
449 名前:440 [2007/12/31(月) 18:56:37 ] 再帰なんて深く理解しなくていいすか? 適当にながしちまえば?
450 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 19:01:59 ] じゃあこれでどうだ int sum(int n) { int ret; printf("enter sum(%d)\n", n); if(n == 1) ret = 1; else ret = n + sum(n - 1); printf("leave sum(%d)=%d\n", n, ret); return ret; } int main() { printf("sum(5)=%d\n", sum(5)); // print 1+2+3+4+5 return 0; } enter sum(5) enter sum(4) enter sum(3) enter sum(2) enter sum(1) leave sum(1)=1 leave sum(2)=3 leave sum(3)=6 leave sum(4)=10 leave sum(5)=15 sum(5)=15
451 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 19:04:18 ] >>449 何を目的で勉強してるかによるんじゃないかな 単位のためとかであれば流しちゃっていいと思う
452 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 19:05:08 ] 滅多に使わないけど、再帰は階層構造を簡単に処理するには非常に便利、 この程度の基本テクニックにねを上げてるようじゃ、先は暗いよ。 諦めずに理解するべし。
453 名前:440 [2007/12/31(月) 19:11:11 ] >>452 理解してみます 再帰はソートっぽいんすね >>451 >>452 とか 他の人たちは socketとかネットワークプログラムとかもへっちゃらすか?
454 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 19:18:10 ] 「へっちゃら」の意味合いによる ネットワーク関連のバグの修正とかは泣きそうになる
455 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:23:41 ] スタックはLIFO
456 名前:440 [2007/12/31(月) 22:31:02 ] test(0); printf("%d",i); tesxt(i+1); の逆の再帰だと理解できます 先にprintfで0を表示してそのあとにtest0+1をして 1になってprintfで1を表示して それを10まで繰り返すんですが 上の440のやり方だと なぜtest(i+1);したあとprintfをやっているのに 9が最初にくるかがさっぱりなんですが より詳しく教えてくれる人はいませんすか?
457 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:42:02 ] >>456 再帰呼び出しが終わったらどこに戻るか考えてみそ。
458 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:44:11 ] 長いのでi<2でやると test(0)→test(1)→test(2)→2は何もしないのでそのまま終了 test(1)に戻る、printf("%d",1)、test(0)に戻る→printf("%d",0) return 0;に戻る
459 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:45:23 ] 10まであると面倒だからif(i<10)のところがif(i<2)だったものとする。 test(i+1)の所に順次、関数の中身を展開していくと、 if(0<2){ if(1<2){ if(2<2){ test(2+1); // ここは実行されない。 printf("%d",2); // ここは実行されない。 } printf("%d",1); } printf("%d",0); } になる。で、10が表示される。これ見たら分かる?
460 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:45:46 ] >>456 たぶん他の人と被ると思うけどw test(0) が呼ばれるじゃん? → i<10 なので、test(1) が呼ばれるじゃん? → i<10 なので、test(2) が呼ばれるじゃん? : 中略するじゃん? → i<10 なので、test(9) が呼ばれるじゃん? → i<10 なので、test(10) が呼ばれるじゃん? → i<10 が成立しないので、何もせずに test(10)を抜けるじゃん? → printf("%d", 9) で 9 が出力されるじゃん? そんでtest(9)を抜けるじゃん? : → printf("%d", 2) で 2 が出力されるじゃん? そんでtest(2)を抜けるじゃん? → printf("%d", 1) で 1 が出力されるじゃん? そんでtest(1)を抜けるじゃん? printf("%d", 0) で 0 が出力されるじゃん? そんでtest(0)を抜けるじゃん? main() 終了じゃん? さあ、何が出力されたかな?っと。
461 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:46:56 ] 3人もかぶるとはめずらしい
462 名前:460 mailto:sage [2007/12/31(月) 22:47:32 ] ほら被ったあw
463 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:50:36 ] おまえら大晦日なのに暇人だな いや大晦日だから暇なのか
464 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:52:11 ] 初詣に出かけるまでの時間、暇で暇で仕方ない
465 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:53:14 ] 休みなんて、コーディングくらいしかやること無いしね
466 名前:440 [2007/12/31(月) 22:57:43 ] おお!わかりやすいです。 ですが何故、繰り上がってる時にprintfが有効にならないのかが不思議です i<10 test(0); test(1)に繰り上がる時は test(i+1)とprintf("%d",i);をやるはずなんですが 何故printfが飛ばされてるんですか?
467 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:59:42 ] test(i+1)が終わらないとprintfに進めないじゃないか。
468 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:59:50 ] わかってないのにわかりやすいとはこれいかに 飛ばされてるんじゃなくて、test(i+1)で止まってると思えばいい で、test(i+1)の処理が終わったら戻ってくる。
469 名前:440 [2007/12/31(月) 23:02:55 ] test(i+1);で10になるまでループしてると考えれば良いんですか? それで10になったら 987654321と戻ると?
470 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:03:02 ] >>440 test は、9 から i までを出力する関数。 引数が 10 未満の時は、まず test(i + 1); とすることで 9 から i + 1 までを出力してから、その次に i を出力してるっしょ? そういうわけで、9 から i までが出力される。 んで、10 以上の数を渡すと、if に引っかかって何も出力されない。 だまされた気分になっても気にしない。
471 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:07:15 ] test(10)は何も表示しない。 test(9)はtest(9+1)を実行してから9を表示する。つまり、9を表示する。 test(8)はtest(8+1)を実行してから8を表示する。つまり、98を表示する。 test(7)はtest(7+1)を実行してから7を表示する。つまり、987を表示する。 …中略… test(1)はtest(1+1)を実行してから1を表示する。つまり、987654321を表示する。 test(0)はtest(0+1)を実行してから0を表示する。つまり、9876543210を表示する。
472 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:13:23 ] 再帰関数を展開して1つ1つ理解しようとしても混乱するだけだよ。 例えば 9 から i までを出力する関数 hoge があるとするだろ? それを使って test を実装しようとすると、一番簡単なのは hoge をそのまま呼ぶだけだけど、 それじゃ面白くないので 9 から i + 1 までを hoge に出力させて、 それから i だけを test 内で出力するという風にしてみよう。 そうすると void test(int i) { if(i < 10) { hoge(i + 1); printf("%d", i); } } となるわけよ。これは分かるっしょ? んで、この test っつー関数は 9 から i までを出力する関数になったわけだから、 hoge としてこの test が使えることになる。 というわけで、 void test(int i) { if(i < 10) { test(i + 1); printf("%d", i); } } としても同じ結果が得られるって寸法だ。
473 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:14:17 ] >>459 とほとんど一緒だけど int main(void) { /* test(0)開始 */ if(0<2){ /* test(1)開始 */ if(1<2){ /* test(2)開始 */ if(2<2){ /* ここは実行されない */ } /* test(2)終了*/ printf("%d",1); } /* test(1)終了*/ printf("%d",0); } /* test(0)終了*/ return 0; }
474 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:18:46 ] _beginthreadexでウィンドウハンドルを渡したいんですが、 どうすればいいですかね?
475 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:19:25 ] スレ違い
476 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:19:57 ] 第3引数から渡すれ
477 名前:440 [2007/12/31(月) 23:21:05 ] なんとか理解しました >>460 さんのが分かりやすかったです まだ完全理解したという訳ではないので勉強してみます 回答してくれた皆様ありがとうございました。
478 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:23:03 ] おそらくスタックがどんな感じなのかわかっていないかな? iがスタック上に積まれる他に関数呼び出しによる復帰情報(ここだとtest()関数な)がスタック上に積まれるんよ 復帰情報は関数が何処に戻れば良いかを示すリターンアドレスが格納されている ここではまだ実行されていないprintf()の直前 つまりイメージとしては 復帰←0←復帰←1←復帰←3←復帰…8→復帰←9←復帰 と積まれる(push) でループから抜けると 今度は 復帰情報→0→復帰→1→復帰→3→復帰…8→復帰→9→復帰 と逆に飛び出してくる(pop) つまりLIFO(Last In First Out)な訳 良くコインの入れ物として説明されている有名アレ
479 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:46:46 ] ああなんか色々間違ってるなゴメン 正しくは push時 main復帰←0←復帰←1←復帰←2←復帰…8←復帰←9←復帰 pop時 main復帰→0→復帰→1→復帰→2→復帰…8→復帰→9→復帰
480 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:55:51 ] スタック云々言って理解できるなら、 再帰ぐらいで悩まないと思う…。
481 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 00:16:15 ] うぬ、そうか、、、スタック説明しないと無理か 大変だな えーっとスタックはローカル変数を格納する為のメモリ領域で・・・ ってスレ違いだなこりゃ スマン調べてくれとしか言いようが無い 頑張ってくれ
482 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 00:18:39 ] 同じ関数だから混乱する。 引数が関数名だと思ってたどってみ test(1)は test1(1)だと
483 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 00:23:13 ] 年越し勉強会になっててワロタ
484 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:18:13 ] printf("あけおめ");
485 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:18:53 ] puts("ことよろ");
486 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:35:47 ] scanf("%d", &otoshidama);
487 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:39:34 ] ^D
488 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:42:40 ] !#include <stadio.h> int mein() { fprint("間違えを見つけた数×100000円お都市玉をもらえます"); } return 0; あけましておめでとうございます
489 名前: 【4円】 mailto:sage [2008/01/01(火) 01:49:08 ] 600000GET
490 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:52:21 ] 600000円が最高金額か ダンヒルの最高値福袋2個分かよw
491 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 06:18:41 ] Max \700,0000- ?
492 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 06:19:18 ] \700,000-
493 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 13:25:28 ] \nが無いのを間違いと見るなら800000円かな?
494 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 13:42:07 ] >>474 4番目のvoid *arglistを使って渡すべし。
495 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:06:42 ] 函数の()の中にvoidとかを書かないのは間違い?
496 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:11:54 ] 函数の()って何だよ。 もうちょっと人に伝わる言葉で表現しろよ。
497 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:13:29 ] さーせん。 「mein()」の()の事
498 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:14:36 ] mein って何だよ
499 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:15:15 ] こっちのセリフです><
500 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:17:14 ] main
501 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:17:39 ] >>497 それだけじゃ、宣言か定義か呼び出しかすら分からないわけだが・
502 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:19:24 ] いえ、>>488 のことですが・・・
503 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:21:26 ] 別に何の間違いでもないだろ
504 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:22:46 ] ( ) 内に何も書かなかった場合 ○ プロトタイプ宣言 引数がどうなっているか不明であることを表す。 その後具体的な引数を指定した宣言や定義が現れない限り、 この関数を呼び出す時、実引数は可変長引数の時と同じように扱われる。 ○ 関数定義 規格上は void であると見なされることになっている。 ただし、上記に書いた通りの動作を起こすコンパイラもある。 ○ 関数呼び出し そもそも ( ) 内に void と書いて呼んではならない。
505 名前:440 [2008/01/01(火) 16:48:42 ] また質問っす #include <stdio.h> #include <string.h> int ko(char *p); int main(void) { char str[80]; gets(str); printf("%d\n",ko(str)); return 0; } int ko(char *p) { int a; a=0; while(*p){ a++; p++; } return a; } なんですが while(*p)なんですが str[80]に入力した文字をどのように繰り返してるんでしょうか? while(*p)だと全然理解ができません 入力した文字列の\0(ヌル文字まで繰り返すんでしょうか?)
506 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 16:57:16 ] while(*p != '\0') { } と同じ。
507 名前:440 [2008/01/01(火) 17:00:23 ] ありがとうございます *pとかよくわかりずらくて参考書にそんなようなこと書いてなくて 次はforでやってみようかと思います
508 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:00:32 ] >>505 ・C言語では偽が0、真が0以外 ・whileは条件が真(つまり0以外)の間、ループを続ける ・C言語の文字列(char配列)はヌルターミネートといって最後にヌル文字('\0')が入っている ・ヌル文字の文字コードは0 ・*は間接参照演算子 つまり >入力した文字列の\0(ヌル文字)まで繰り返す で正しい。 ヌル文字ではなかったらaをインクリメントし、ついでにpを進める、ということを繰り返す まあ(半角)文字数を調べる関数だね
509 名前:440 [2008/01/01(火) 17:06:50 ] >>508 あ!だからヌル文字で終わるんですね ヌル文字=0って事を・・・ 文字列とかが入るとややこしくなるんで これを使えば特定の文字の数を数える関数とかへっちゃらっすね
510 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:25:47 ] でも、ちゃんと '\0' と比較した方が読みやすいから比較しようぜ
511 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:35:04 ] そうだね。 こんな読みにくいコード書いても、読みやすいコードに比べて実行速度が速くなる訳じゃないもんね。
512 名前:440 [2008/01/01(火) 17:42:21 ] 実行速度ってどうなんすか? 僕が作るプログラムではそこまでイライラするほどかからないんすが
513 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:54:41 ] 全く変わらん。