- 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/
- 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 ]
- 全く変わらん。
- 514 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:16:56 ]
- #include <stdio.h>
int main(void) { while(1) { printf("おまいら\n"); printf("あけましておめでとう!\n"); } return 0; }
- 515 名前:440 [2008/01/01(火) 19:18:16 ]
- ネットワークプログラム作りたいんすよね
どんな過程でネットワーク系に入りますか? まずC言語の文法など覚えてたらすぐネットワーク系のプログラムとかやりますかね?
- 516 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:27:54 ]
- ネットワークプログラムは結構めんどくさい。文法覚えただけでは苦戦する。
でも、目的を持って難題に立ち向かうのが上達の秘訣だとおもう。 コードを書いていれば、何が必要かだんだんとわかってくる。 すぐに作れなくてもあきらめないことが重要だよ。
- 517 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:47:55 ]
- #if
#else if #end if の使い方がわかりません! どういうときに使うんですか!
- 518 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:51:35 ]
- 以下の★1と★2のやり方で結果が同じになるのはどうしてなんでしょうか?
有識者の方ご教授をお願いします。 #include<stdio.h> void * func(void *p){ printf("□■□func開始□■□\n"); printf("pのアドレス = %p\n",p); printf("p = %d\n",(int)p); (int)p += 100; printf("p = %d\n",(int)p); printf("□■□func開始□■□\n"); return NULL; } int main(void){ int number = 30; printf("numberのアドレス = %p\n",&number); func((void *)number);★1 return 0; }
- 519 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:52:05 ]
- #include<stdio.h>
void * func(int *p){ printf("□■□func開始□■□\n"); printf("pのアドレス = %p\n",p); printf("p = %d\n",*p); *p += 100; printf("p = %d\n",*p); printf("□■□func開始□■□\n"); return NULL; } int main(void){ int number = 30; printf("numberのアドレス = %p\n",&number); func(&number);★2 return 0; }
- 520 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:58:22 ]
- >>517
#define VER 2 #if VER < 2 //古いコード #else //新しいコード #endif みたいにソースを丸ごと切り替えるときに使ったりする 慣れると便利。
- 521 名前:440 [2008/01/01(火) 19:59:01 ]
- >>514
それは、おまいら あけましておめでとうを無限ループですね? while(1)なので
- 522 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:59:45 ]
- >>518
1はちゃんと動くのか?
- 523 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:03:15 ]
- >>522
*(int*)p += 100; とすると、同じ結果が出るね。
- 524 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:05:54 ]
- >>517
デバッグ時にコードを一時的に無効化したり有効化するのに便利だね。 /* */とは違って、入れ子にできるから楽 #if 0 hoge(); hoge2(); #endif
- 525 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:07:40 ]
- >>523
ほんとに func((void *)number);★1 こうなのか?
- 526 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:11:00 ]
- >>525
たしかに。&がないと通らないね。
- 527 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:12:32 ]
- >>523
怒られるんだけどw
- 528 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:25:21 ]
- >>520 >>524
ありがとうございます! ということは int VER みたいなフラグを作っておいて使うんですね! #if 0 とか参考にしてたソースに出てきてわからなかったです ありがとうございました!
- 529 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:42:21 ]
- >>528
>int VER みたいなフラグ 駄目です、それじゃ使えません
- 530 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:46:59 ]
- >>523
*(int*)p それは参照先がアレじゃないか?
- 531 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:52:07 ]
- >>518
そのこぴぺされたコードで、コンパイルして実行できるか、もう一度確認してみてくれないか? ちなみにWindows?もしかしてDOS?
- 532 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:53:06 ]
- >>529
orz 使い方おしえてくだしあ
- 533 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:55:26 ]
- >>532
>>520 ただの置換だと思えばいい
- 534 名前:440 [2008/01/01(火) 21:01:52 ]
- viみたいなエディタ作るには
1人じゃ無理すかね?
- 535 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:03:12 ]
- >>532
プリプロセッサと呼ばれる機能なのだ。 #defineはマクロで、文字列の置き換え #define VAR 2 と書くと、今後ソースのVARは2という文字に置き換えられる。 #ifは条件付コンパイル。式が0でなければ有効となる。 #if VAR>1 と書くと、以下と同意になる。 #if 2>1 となって、式の結果は、1なので、有効となる。
- 536 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:03:21 ]
- viみたいなエディタなら無理じゃない
- 537 名前:440 [2008/01/01(火) 21:05:24 ]
- 画面上に色とかつけたりしてるのは、あれはC言語でやってるんすかね?
viで色とかが使えるすがスキームなど色文字を表示することは可?
- 538 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:06:45 ]
- >>537
DOSなら、エスケープシーケンスじゃないか?
- 539 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:14:13 ]
- WindowsならコンソールAPI
- 540 名前:440 [2008/01/01(火) 21:15:29 ]
- Linuxじゃ無理すか?
たしかにwindowsだと猫でもわかるC言語に書いてありましたが
- 541 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:18:55 ]
- 猫か…
- 542 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:21:45 ]
- >>540
linux エスケープシーケンス使えるよ printf("\033[31mhogehoge\n"); って感じで
- 543 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:25:50 ]
- VT100か
- 544 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:25:59 ]
- >440
ちょっとは自分の頭を使って集中して物を考えたり調べも伸したりする習慣をつけろよ
- 545 名前:440 [2008/01/01(火) 21:47:36 ]
- >>542
すげーっすね! できましたよ エスケープシーケンスで調べてきます >>544 以後気をつけます
- 546 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 00:02:28 ]
- >>523
左辺値にキャストはできないだろ?
- 547 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 09:04:56 ]
- >>546
これを実行してみてほしい #include<stdio.h> int main(void){ long num=1234; *((char*)&num)+=65536+256; printf("%ld\n", num); *((short*)&num)+=65536+256; printf("%ld\n", num); return 0; }
- 548 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 09:59:34 ]
- キャストしたものは左辺値じゃないけど、* をつけたから左辺値で通るんだよ。
- 549 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 22:28:47 ]
- #include <stdio.h>
#include <malloc.h> main(togo,toog) int togo; char *toog[]; {char *ogto, tgoo[80];FILE *ogot; int oogt=0, ootg, otog=79, ottg=1;if ( togo== ottg) goto gogo; goto goog; ggot: if ( fgets( tgoo, otog, ogot)) goto gtgo; goto gott; gtot: exit(); ogtg: ++oogt; goto ogoo; togg: if ( ootg > 0) goto oggt; goto ggot; ogog: if ( !ogot) goto gogo; goto ggto; gtto: printf( "%d goto \'s\n", oogt); goto gtot; oggt: if ( !memcmp( ogto, "goto", 4)) goto otgg; goto gooo; gogo: exit( ottg); tggo: ootg= strlen(tgoo); goto tgog; oogo: --ootg; goto togg; gooo: ++ogto; goto oogo; gott: fclose( ogot); goto gtto; otgg: ogto= ogto +3; goto ogtg; tgog: ootg-=4;goto togg; gtgo: ogto= tgoo; goto tggo; ogoo: ootg-=3;goto gooo; goog: ogot= fopen( toog[ ottg], "r"); goto ogog; ggto: ogto= tgoo; goto ggot;} これは何ですか?
- 550 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 23:13:44 ]
- たしかIOCCCのプログラム。別に何ってわけじゃない。
- 551 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 00:00:33 ]
- 頭が物故割れた
- 552 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 00:24:50 ]
- #include <stdio.h>
#include <string.h> int main(int argc, char *argv[]) { char *position, line[80]; FILE *fp; int counter=0, num, maxbuf=79; if ( argc == 1) {return 1;} fp= fopen(argv[ 1], "r"); if ( !fp) {return 1;} position= line; while ( fgets( line, maxbuf, fp)) { position= line; num= strlen(line); num-=4; while (( num > 0) && ( !memcmp( position, "goto", 4))) { position= position +3; ++counter; num-=3; ++position; --num; } } fclose( fp); printf( "%d goto \'s\n", counter); return 0; } たぶんこういうこと
- 553 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 00:40:09 ]
- まちがえた、・・・まぁいいか・・・
- 554 名前:デフォルトの名無しさん [2008/01/05(土) 01:12:12 ]
- Javaを半年ほどやってCを最近始めた素人です。
同じソースファイル内でも関数の定義位置が違うだけで、 コンパイラが、関数宣言ないよー。という警告をするのが、 いまいち慣れないのですが。 static宣言な、ファイル内スコープの関数なんかでも、 プロトタイプ宣言ってきちんとしたほうが良いのでしょうか。 手元にあるC言語入門だと、main関数を最後のほうに、 定型的な計算用の関数等を、頭のほうにもってきて、 プロトタイプ宣言を書かないようしているのですが、 皆様はどういった書き方をしておられるのでしょうか・・・。
- 555 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 01:14:41 ]
- >>554
基本的に、ソースファイルの書き方は一貫性が大事だと思っている。 だから、一貫性を持って読みやすければそれでOKだ。
- 556 名前:デフォルトの名無しさん [2008/01/05(土) 01:29:27 ]
- >>554
おぃ… どのportでaccessしろと云うのだ?
- 557 名前:デフォルトの名無しさん [2008/01/05(土) 01:51:07 ]
- www.microsoft.com/japan/msdn/vs/vcsharp/mth_lexicograp.aspx
から.msiインスコしたまではいいですが、ここからどうすればアプリとして起動できますか? よく分からないままMS Visual C#2008入れました。 最終的にやりたいのは、nCrで任意のnとrを最初に指定して、.txtファイルで1行毎に記述した多数の序数x(1≦x≦nCr)を組み合わせ化して別の.txtファイルにsaveすることです。
- 558 名前:デフォルトの名無しさん [2008/01/05(土) 02:09:33 ]
- 方向音痴な初心者です
因みに… '/usr/share/doc/man1/或.zg 個人の計算では恐らく'/usr/share/doc* 全てを読み込む様に為っていた筈…
- 559 名前:デフォルトの名無しさん [2008/01/05(土) 02:20:37 ]
- 最後の状態…
1・再起動がBIOSに到達せず再起動… 2・停止がBIOSに到達せず停止の筈が再起動… 3・RANを切らないと停止せず…
- 560 名前:デフォルトの名無しさん [2008/01/05(土) 02:25:06 ]
- 斯様に考えてもfile内に.pngを埋め込むのは無理と考えerror_fileを削除の末…
此の顛末…
- 561 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 02:31:08 ]
- 次の質問をどうぞ
- 562 名前:557 [2008/01/05(土) 02:42:49 ]
- see me(>>557) plz!
- 563 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 02:55:06 ]
- >>557>>562
ここはC#のスレではありませんよ
- 564 名前:557 [2008/01/05(土) 03:49:11 ]
- >>563
Spcially sorry, sir.
- 565 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 07:32:27 ]
- >>554
> 手元にあるC言語入門だと、main関数を最後のほうに、 > 定型的な計算用の関数等を、頭のほうにもってきて、 > プロトタイプ宣言を書かないようしているのですが、 > 皆様はどういった書き方をしておられるのでしょうか・・・。 基本的に読むときのことを考えて書く。 文章は上から下へ向かって読む。 だからプロトタイプ宣言も書いてmainの下に呼び出す関数を書く。 よく見るif (0 == a) みたいなやり方(=を書き間違えるミスを防ぐやつね) もバッドノウハウだと思う。
- 566 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 09:07:16 ]
- >>565
最後の2行は同意するが、関数をボトムアップで書くのは臨機応変でありだと思う。
- 567 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:07:08 ]
- >>565
> よく見るif (0 == a) みたいなやり方(=を書き間違えるミスを防ぐやつね) > もバッドノウハウだと思う。 なんで? 他にいい方法ある?
- 568 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:07:35 ]
- はい、次の質問どうぞ〜
- 569 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:14:55 ]
- >>565
>基本的に読むときのことを考えて書く。 >文章は上から下へ向かって読む。 >だからプロトタイプ宣言も書いてmainの下に呼び出す関数を書く。 うーん・・・微妙。 結局main関数がファイルの一番上に来るわけでもないし、 mainを最初に持ってきたからって可読性は上がらないと思う。 コード全体で一貫性があればケースバイケースどころか 趣味の範疇じゃない?
- 570 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:18:41 ]
- >>567
最近のコンパイラなら警告を出すはずだし、lintもある。 それに、 if (a = b) は防げない。 -Wall で出る警告をすべて潰すか、lintを使う習慣をつけたほうが良い。
- 571 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:19:25 ]
- Cに慣れると関数がボトムアップに並んでないと不自然に見えてくる。
- 572 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:32:24 ]
- >>555で終わってるネタ
- 573 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:32:49 ]
- >>569
おれは >>565に同意。 main関数を一番下に持ってくるのは、プロトタイプ宣言がなかった頃の 古い習慣を引きずってるだけだったはず。 >結局main関数がファイルの一番上に来るわけでもないし、 これはその通りだけど、プロトタイプ宣言を長々と書くことは少ないし、 たとえ長くなっても関数ブロックがどこから始まるかはすぐわかるので、 main関数が上にあるはうが見つけやすい。 あと、呼び出す関数の引数などを見たいとき、 プロトタイプ宣言が一箇所にまとまっているほうが見やすいと思う。 まあ、これはコーディングスタイルだから、強くは主張しないけど。
- 574 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 11:27:15 ]
- >>573
プロトタイプ宣言のなかった頃という実例を提示してくれ。 宣言がなかったら外部の関数は一切まともに呼べないと思うのだが。
- 575 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 11:28:40 ]
- > mainがどうとか
最近はフリーのでもエディタが強いからなぁ。 気にならなくなったし気にしなくなった。
- 576 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 13:31:36 ]
- 10個の配列に入っている数それぞれが
全て異なるってどういう風に書けばいいんでしょうか?
- 577 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 13:37:21 ]
- int array[10];
for (int ic = 0; ic < sizeof(array) / sizeof(* array); ++ic) array[ic] = ic;
- 578 名前:576 mailto:sage [2008/01/05(土) 13:45:39 ]
- 追記すいません。
10個の配列には既に数字が入っていて 条件式でかくならどうすればいいですかね?
- 579 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 13:58:18 ]
- ループでまわすか45個条件式書くか、好きなほうにしろよw
- 580 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 14:23:57 ]
- 無駄に再帰
int unique(int array, int n){ int i; if(n <= 1)return 1; for(i=1; i<n; ++i) if(array[0] == array[i]) return 0; return unique(array+1, n-1); }
- 581 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 14:29:42 ]
- 要素数intを再帰するのはちょっと勇気がいる。「スタックはもう0よ」に気をつけて。
- 582 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 14:34:42 ]
- 要素10個の配列を想定した再帰でスタックの心配とかw
- 583 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 14:35:36 ]
- >>581
そこで最近覚えた末尾再帰の最適化ですよ。
- 584 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 15:10:46 ]
- "入っている数"があまり大きくない数字(例えば0〜9999とか)なら、
配列(例なら10000要素)を用意して重複チェックするという手もある 10回ループすればわかる
- 585 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 15:56:01 ]
- ソート済み配列なら楽なんだがな
- 586 名前:576 mailto:sage [2008/01/05(土) 16:39:31 ]
- >>584ので
わかった気がします。 ありがとうございました
- 587 名前:584 mailto:sage [2008/01/05(土) 17:50:36 ]
- あぁ 577 にもヒントが
見落としていたよorz
- 588 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 17:59:25 ]
- mainなんて最後に読むから下にあったほうが邪魔にならなくていいな
- 589 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 00:48:37 ]
- mainから読まないと理解できない俺はorz
コメント豊富ならいいが、 そうでなければ順を追わないと分かりづらい……
- 590 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 00:56:00 ]
- どうせ上から下に綺麗に順に追って読めるわけじゃないから、どこにmainがあってもいいや
- 591 名前:554 mailto:sage [2008/01/06(日) 01:04:01 ]
- レス有難う御座いました。
結論としては>>555なのでしょうが。 自分はIDE使っていて、 >>573さんの様なスタイルがやりやすそうです。 コンソールでUnixプログラムとかを書ける様な方だと また意見も変わってくるんでしょうかね…。 >>571とかも参考になります。 皆様ご意見有難う御座いました。
- 592 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 04:10:09 ]
- すいません、超初心者なんですが判らなくなったので教えていただけませんか?
今アクセスカウンタを作ろうと思って、まずは簡単に動く物をテストで作ってみ ようかと思ってるのですが、思った動作をしてくれません・・ ipアドレスをゲットして、そのipアドレスから連続でアクセスがあった場合カウンタ が回らないようにしたいです。超初心者の自分なりに書いてみたのですが、同じipから のアクセスでもカウンタが回ってしまいます。ソースは #include <stdio.h> #include <unistd.h> #include <stdlib.h> main() { long i; FILE * fp; char *test,*ip,*count="count.dat",*addr="addr.dat"; test = getenv("REMOTE_ADDR"); fp = fopen(addr,"r+"); fgets(ip,30,fp); if(ip==test){ printf("test"); fclose(fp); }
- 593 名前:592 mailto:sage [2008/01/06(日) 04:11:42 ]
- else
{ fprintf(fp,test); fclose(fp); fp=fopen(count,"r+"); rewind(fp); fscanf(fp,"%6ld",&i); i++; rewind(fp); printf("Content-type: text/plain\n\n\0"); fprintf(fp,"%06ld",i); printf("%06ld",i); fclose(fp); } } こんな感じです。多分どっか物凄く適当な事をしてる部分があると思うのですが 自分ではぜんぜんそれがどこか判りません・・・ 誰か教えてください・・・
- 594 名前:592 mailto:sage [2008/01/06(日) 04:13:28 ]
- あー15行目の
printf("test"); はif文に入ったかどうかチェックする為に書いた物で意味はありません。
- 595 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 04:19:46 ]
- 基礎からやった方が良いと思うけど、とりあえず。
・ipは只の未初期化のポインタ ・文字列の比較は==ではしない
- 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 ]
- まだやんの
|

|