- 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/
- 596 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 04:19:57 ]
- >>592
char* ip; で fgets(ip,30,fp); は臭う if(ip==test) ポインタ比較してどうする 文字列比較は strcmp (string.h) 全部読んでないが、ここら辺。
- 597 名前:592 mailto:sage [2008/01/06(日) 04:35:19 ]
- >>595-596
こんな時間なのに即レスありがとうございます。 もう少しポインタの勉強してきます・・・
- 598 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 04:42:36 ]
- ポインタの前に配列を
- 599 名前:592 mailto:sage [2008/01/06(日) 04:56:42 ]
- あぅあぅ・・
眠いせいか全く頭まわらず、未だ解決の糸口が掴めません・・今日はもう寝ます。 もしよかったら592の鳥頭でも判るcの初心者向け解説サイトなんかあったら教えていただけますか?orz よく寝て頭冴えてる時にもう1度チャレンジします。
- 600 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 05:09:17 ]
- >>599
ttp://www9.plala.or.jp/sgwr-t/
- 601 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 05:09:35 ]
- >>592
char *test,ip[128],*count="count.dat",*addr="addr.dat"; にして if(ip==test){ は #include <string.h> を追加して if(strcmp(ip, test) == 0)だな あと、printf("Content-type: text/plain\n\n\0"); の最後の\0は要らない サイトより、しっかりした一冊を読んだほうが為になると思う
- 602 名前:592 mailto:sage [2008/01/06(日) 05:55:21 ]
- 眠い目こすりながら"もうちょい・・もうちょい・・"ってやってたら出来ました!
600さん601さんありがとうです。ほぼ601さんの書き込み通りで出来ました。 else の後に rewind(fp); が無かったのでaddr.datが追加書き込みで上手く働かなかったのだけ なんとか自力で見つけて修正しました。ホント有難うです!
- 603 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 10:25:50 ]
- >>574
つ homepage3.nifty.com/ryuz/c/about_ansi.html >宣言がなかったら外部の関数は一切まともに呼べないと思うのだが。 外部の関数はextern宣言で呼ぶ。 古いソースを見ると、こんなのを見かける。 #ifdef __STDC__ int func(int arg1, char *arg2); #else int func() /* これが古いスタイル */ #endif 今はもう過去の遺物だが。
- 604 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 10:36:54 ]
- まだやんの
- 605 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 12:26:34 ]
- >>603
まさか、その「古いスタイル」という奴は宣言ではないとでも?
- 606 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 12:42:43 ]
- 昔はいきなり呼べたような。
そのためmath.hをインクルードしてないと引数がintになったりしてたような
- 607 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 12:45:03 ]
- 今でもいきなり呼べるよ
- 608 名前:603 mailto:sage [2008/01/06(日) 12:59:23 ]
- >>605
ごめん、間違えた。 #ifdef __STDC__ extern int func(int arg1, char *arg2); #else extern int func() /* これが古いスタイル */ #endif こうだった。
- 609 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 14:23:04 ]
- >>608
セミコロン要らないの?
- 610 名前:603 mailto:sage [2008/01/06(日) 15:20:15 ]
- >>609
もちろん要るorz
- 611 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 16:17:55 ]
- まだやってたのか。
>>605 とりあえず「プロトタイプ宣言」では無いと思う。 >>606-607 >引数がintになったりしてたような 戻り値とちゃうか? んで、暗黙の戻り値の型はC99でダメにならなかったっけ?
- 612 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 17:17:39 ]
- >>611
古い仕様やANSI非準拠の環境ならプロトタイプ宣言なくても関数呼び出しが可能。 戻り値は省略された場合intとみなす(これは確か規格) 引数はそこに関数呼び出しがあるならプロトタイプ宣言がなくとも予測できる。 int func();// ←プロトタイプ宣言 int a = func( 5, "hoge" ); と書かれていればfuncの引数が予測できる。
- 613 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 17:22:03 ]
- 予測も何も、そのままスタックに積んで取り出すだけでしょ
あってる限り問題は出ない
- 614 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 17:32:58 ]
- コール規則が複数あるような場合に嵌るだろ
- 615 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 17:47:37 ]
- プロトタイプを人間が確認してるようなもんだな
- 616 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 19:08:31 ]
- >>612
なんか色々とウサンクサイな・・・
- 617 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 20:50:50 ]
- まぁ、math.hをインクルードせずにprintf("%g\n", log(1))してみたまえ。いいもんだ。
- 618 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 21:04:47 ]
- %gってなんすか?教えてくだしあ
- 619 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 21:07:50 ]
- printfでぐぐれ
- 620 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 21:08:20 ]
- manコマンドしか見てなかったよ
- 621 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 21:09:06 ]
- ごめんうそ
- 622 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 21:21:22 ]
- 普通に、man printfしても出てくるでしょうが。
- 623 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 22:21:17 ]
- プロトタイプ宣言。
200〜300行程度のプログラムならなんとでもなるね。 問題は複数の Cファイルに分割しなければいけない時。 ファイル数が多くなり、extern 関数呼び出しが多くなった時 プロトタイプ宣言が有る場合と無い場合とではバグ出現回数が 大幅に違ってくる。 プロトタイプ宣言する事を癖にした方が良いよ。
- 624 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 22:22:41 ]
- ますます話が迷走を深めてまいりました
- 625 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 22:26:46 ]
- >ファイル数が多くなり、extern 関数呼び出しが多くなった時
>プロトタイプ宣言が有る場合と無い場合とではバグ出現回数が >大幅に違ってくる。 ソースキボン
- 626 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 22:42:32 ]
- >>625
プロトタイプ宣言がない場合、関数の引数の数と型を合わせるのはプログラマの責任になる。コンパイラはチェックしない。 ファイル間の膨大な数の関数と呼び出しで、それを完璧にやれる人はまずいない。
- 627 名前:623 mailto:sage [2008/01/07(月) 00:38:00 ]
- >>625
ソースなんてないよ。 実体験。 まだ経験してないのであれば...幸せなのか天才なのか、はたまた...
- 628 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 00:42:39 ]
- ソースが無いのにどうやって体験したんだとか勘違いした俺はどうすれば
- 629 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 01:02:06 ]
- >>628
俺も一瞬思ったw >>627 昔はソース書いてからコンパイラに吐かせてプロトタイプ作ったりもしたが 今はIDEもあるし、ほぼ同時に作るべ、 複数人でやるならソースとヘッダの提供は不可欠だしな
- 630 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 01:04:46 ]
- 627と628の言うソースは違うものを指していると思われ。
- 631 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 01:06:02 ]
- 野暮だな
- 632 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 03:51:40 ]
- そんなことは628もわかってんのにな
- 633 名前:U [2008/01/07(月) 17:58:56 ]
- 質問です・・
if (a < (int)(a * 10) % 10){ a = (int)a+1; } (注:aはdouble型です) 上記のような文がプログラム中にあったとき、aを7.1なら8のように小数の切り上げをしたいんですがこれでなっていることになるのでしょうか? 小数の切り上げの方法を知っていたら教えてほしいです(標準関数を用いない方法で)。
- 634 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 18:08:15 ]
- その前に標準関数を使って行けない理由を聞かせてもらおうか。
- 635 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 18:15:09 ]
- 条件がはっきりしないけど、0.9足して切捨てとか
- 636 名前:633 [2008/01/07(月) 18:22:42 ]
- >>634
学校の課題なので使ってはいけないという制限があるんです。 >>635 回答ありがとうございます。 ですがすみません7.1の他にも小数があるのでそれ以外にも対応出来るようにしたいんです。
- 637 名前:633 [2008/01/07(月) 19:05:00 ]
- if文の不等号を逆にしたら出力したい結果が無事でました!!
とても答えづらい質問ですみませんでした。
- 638 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:10:03 ]
- は?
- 639 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:11:03 ]
- 解決したと思ってるんならそれでいいだろ。
詮索することはあるまい。
- 640 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:32:25 ]
- 「宿題の回答」としてはベストな回答だと思うよ。
- 641 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:35:31 ]
- アホだろ
- 642 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:44:31 ]
- (n + d) / d;
だめ?
- 643 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:47:15 ]
- だめ
- 644 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:52:15 ]
- 適当に貼ってみる
#include<stdio.h> #include<stdlib.h> int main(int argc, char *argv[]){ double value=100.001; long result; if(argc>=2) value=atof(argv[1]); result=value; /* この行と */ if(value>result) result++; /* この行 */ printf("%ld\n", result); return 0; }
- 645 名前:デフォルトの名無しさん [2008/01/08(火) 00:57:40 ]
- 101 287 345 391 348 287 391
371 388 39 388 88 404 150 428 404 387 145 299 404 197 320 397 141 342 428 429 206 36 214 412 88 176 214 346 210 406 308 250 26 112 370 328 328 284 こんな感じのデータファイル(data.txtの一部です)を2次元配列にいれるにはどうプログラミングすればいいですか? 改行とかスペースをどう考慮していけばいいかさっぱりです
- 646 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 01:07:31 ]
- >>645
つ[fscanf()]
- 647 名前:デフォルトの名無しさん [2008/01/08(火) 01:10:12 ]
- >>645
fscanfでも使ったら?
- 648 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 01:13:50 ]
- >>645
for(i = 0; !feof(fp); i++){ do{ fscanf(fp,"%d",&date[i][j++]); }while(fgetc(fp) != '\n'); }
- 649 名前:デフォルトの名無しさん [2008/01/08(火) 01:28:52 ]
- いやfscanfも普通に改行コード読み飛ばすし
- 650 名前:デフォルトの名無しさん [2008/01/08(火) 02:15:50 ]
- >>648
!feof(fp); って何ですか?
- 651 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 02:24:07 ]
- >>650
つ www9.plala.or.jp/sgwr-t/lib/feof.html ファイルの終端でない間ループする 0 != feof(fp)
- 652 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 03:13:53 ]
- 今年からやさしいCを買ってはじめたんだけどscanfがでてきてからいっきに面白くなってきやがったぜ!
- 653 名前:デフォルトの名無しさん [2008/01/08(火) 03:36:40 ]
- ほとんど利用しない命令
- 654 名前:デフォルトの名無しさん [2008/01/08(火) 03:46:36 ]
- >>652
面白くなってきたのか!! 良いことだ!! ただ油断するなよ。 scanfの仕様をもう一度確かめるんだ!! 不具合が多くて嫌になるぜ!!
- 655 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 05:02:29 ]
- >>653
ほとんど使わないのかよ! >>653 printfとかだとなんか字がでてくるだけでつまらなかったけど scanfだとキーボード側から入力できて面白くなってきたぜ しかし練習問題やったら、doubleなのに変換仕様を%fにしてたり 変数の前に&入れてなかったりとミス多発\(^o^)/ 質問スレなのにすいません
- 656 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 05:50:55 ]
- >>655
scanfは正しい入力をしているならまだいいが、ひとたび間違った入力が来ると簡単にバグの原因になる。 整数(%d)を欲しいところで文字列なんて打っちゃった日にはもう・・・ まぁ外に出すようなものじゃなければ気にしなくてもいいけどね。 慣れてきたらそこらへんも勉強してみるといいと思うよ。
- 657 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 08:03:25 ]
- >>651
0 == feof(fp)
- 658 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 10:07:45 ]
- !feof(fp)
だろ。それじゃ4バイトも無駄になる。
- 659 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 10:15:14 ]
- とりあえず、入力と出力ができるようになってからいろいろ試せるんだし
scanfから入るのもいいんじゃない?そのうち使わなくなるだけで
- 660 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 13:18:16 ]
- >>658
どこでどんな4バイトが無駄になるんですか?
- 661 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 13:40:14 ]
- >>656
それは返り値でなんとかなるだろ いやscanfで値取得がだめなのはもちろんなんだがな、オーバーフローは検知不可能できないし そもそも>>658は誰宛なんだよwww
- 662 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 13:48:35 ]
- >>661
>オーバーフローは検知不可能できないし 検知できるんですか? できないんですか? そもそも、その「オーバーフロー」とはなんのことですか?
- 663 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 13:49:56 ]
- 知らない言葉が出てきたら自分で調べる癖つけないといつまでたっても上達せんよ
- 664 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 14:04:00 ]
- >>662
オーバーフローとは 風呂にお湯を張るとき、止めるのを忘れたときに起こる奴
- 665 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 14:07:58 ]
- エウレカ!エウレカ!
- 666 名前:662 mailto:sage [2008/01/08(火) 14:57:16 ]
- >>663
「オーバーフロー」の意味は判るのですが、整数値の入力でどんなオーバーフローが起きるのかと思いまして。
- 667 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 15:07:06 ]
- intの最大値は(4バイトの場合)2147483647でこれ以上大きい数値は格納できない。
longもunsignd intもcharもそれぞれに最大・最小値があるから、それを超える値を入力されると困る。
- 668 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 15:38:01 ]
- char *foo[] = {"C/C++", "は", "市ね"};
のような文字列の配列があった場合に、この配列の長さ(上の例では3)を 取得するにはどのようにすればできるでしょうか? length のような関数があるのではないかと思うのですが、、、
- 669 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 15:39:06 ]
- sizeof(foo)/sizeof(*foo)
- 670 名前:662 mailto:sage [2008/01/08(火) 15:49:00 ]
- >>667
なるほど。で、それは検知不可能なんですね? では検知できる入力関数はあるのでしょうか。 或いは、桁数制限してしまえばオーバフローは回避できますよね。
- 671 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 15:55:39 ]
- getsとかで数字を文字列として読み込んで、atoiとかで文字列を数字に変換する、とか。
文字列としてならいくらでも大きい数値を入れられるし、atoiはオーバーフローを検知してくれる。
- 672 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:12:32 ]
- >>669 ちょっとダサイけど、thx!
- 673 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:16:36 ]
- >>671
getsはない。
- 674 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:19:02 ]
- んだ。今度はバッファオーバーフローだな。
- 675 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:20:31 ]
- scanfでも桁数制限できるだろ
- 676 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:24:41 ]
- >>650
if(!num) はif(num == 0)と if(num) はif(num != 0)と同じ意味 while(!feof(fp))はfeofの返り値が0になるまでって意味
- 677 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:32:53 ]
- ごめん
feofの返り値が0の間
- 678 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:38:00 ]
- >>671
果てしなく無意味なオーバーフロー対策だなwwwwwwwww
- 679 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:39:34 ]
- プロンプトで入力待ちするプログラムなんて練習のときくらいしか使わんからなんでもいいべ
リダイレクト前提のやつはこの限りでもないが。
- 680 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:56:16 ]
- for(i=0; i < 10; i++){
printf("%d %d\n",x++,x); } だと表示される値は2つとも一緒なのに printf("%d %d\n",x,x++); に変えるとなぜ左側のほうが大きくなるのでしょうか? 後ろに++を付けているのだから右側が大きくなるべきだと思うのですが
- 681 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:57:05 ]
- なんだべきって
- 682 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 16:58:08 ]
- >>680
それ未定義動作 まあ理由としては、引数は後ろからスタックに積むから後ろの式を先に評価するケースが多いからだろうな。
- 683 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 17:03:12 ]
- >>681
「べき」って使いませんか? 「大きくならなければならないと思うのですが」というニュアンスです。 >>682 素早い回答有り難うございます。
- 684 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 17:10:17 ]
- 681は日本語を勉強するべきだろう。
- 685 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 17:49:24 ]
- SEになりたくて、IT企業に就職しても、
途中で挫折する人がいて退職する人も多々いると聞きます。 そう言われてる箇所は、だいたいどういう箇所なのか 具体的に教えてくれませんか?
- 686 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 17:50:06 ]
- 人間関係
- 687 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 18:03:14 ]
- マ板で聞け
pc11.2ch.net/prog/
- 688 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 20:04:43 ]
- UNIX Cシェルのmakefileで、
外部の環境変数が設定してあるファイルを makefileの中から読み込むことって出来ますか? 出来るなら方法を教えてください。
- 689 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 20:17:37 ]
- さすがにそれはシェルスクリプトのスレかmakeのスレで聞いた方がよくね
- 690 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 20:29:21 ]
- >>689
ありがとうです makeスレがないですね シェルはあまり関係なさそうだし・・ うーん。どこがいいんだろ・・
- 691 名前:688 mailto:sage [2008/01/08(火) 20:38:44 ]
- それっぽいスレ見つけました
そちらで聞いてみます。どうもありがとうでした。
- 692 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 21:03:00 ]
- fopenの書き込みモードで第1引数(?)にC:\save.txtのように入れたのですが、指定したフォルダを探してもファイルがありませんでした。
エラーは出なかったのでおかしいと思って、読み込みモードで同じフォルダを指定すると読み込むことができました。 あれ?と思いそのフォルダを開いてみたのですが、ファイルは見当たりませんでした。 これはどういうことなんでしょうか?
- 693 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 21:04:03 ]
- >>692
C:\\save.txt
- 694 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 21:05:43 ]
- え?ファイルが無いのに読み込めたの?
- 695 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 21:08:09 ]
- >>693
ありがとうございます! ファイルを保存できました。 >>694 そうなんです これはなぜだったんでしょうか?
- 696 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 21:35:54 ]
- >>695
書き込みモードで起動したときにファイルを作成したと思う。
|

|