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/
751 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 06:12:14 ] 構造体で 氏名 年齢 住所 が入る変数を宣言しその構造体の配列を10人分用意しループで順番に入力してもらい氏名、住所、年齢に 空ENTERが入るとループを終了するということをしたいのですが。 全ての項目に空ENTERが入力されるとループを終了するという所をどのように書けばいいのかわかりません。 教えて下さい。
752 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 06:37:02 ] >>751 空ENTERが入力されたかどうか判別するプログラムは作れるのか?
753 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 10:41:06 ] >>751 氏名をfgets関数で入力し、strlen関数で氏名の文字数を求め、それがゼロだったら終了
754 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 12:34:26 ] fgetsってファイル関連の関数じゃないの? 文字入力として使えるの?
755 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 12:37:19 ] えー
756 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 12:43:11 ] >>754 っ stdin
757 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 13:34:55 ] printf()とかputs()とかscanf()とか全部廃止して、f****()に統一すりゃいいのに。 ストリームの概念が理解しやすくなる。
758 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 13:48:56 ] f***()とか全部廃止してopen/close/read/writeにすれば良いのに。 ディスクリプタの概念が理解しやすくなる。
759 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 13:54:48 ] もう開く/閉じる/書く/読むでいいよ。
760 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 13:56:07 ] それなんてinterface?
761 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 14:14:31 ] LISP だと以下のようにして定義できるが (defun 開く (file-name mode &optional perm) ...) (defun 閉じる (file-desc) ...) (defun 書く (file-desc buff buff-size) ...) (defun 読む (file-desc buff buff-size) ...) まぁ, スレ違いだわな
762 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 17:50:32 ] スレ違いに値しますが、どなたかtabキー送り幅の設定方法を教えて下さい 8マスから4マスに変えたいです
763 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 17:51:57 ] >>762 環境による。また、アプリケーションの設定にもよる。
764 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 17:52:18 ] スレ違いすぎるwww エディタによる、いやそもそもエディタの話なのかも知らんが
765 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 17:52:22 ] それは表示する側の問題だろ。Cの範疇じゃ無理。 使ってるOSと端末くらい書け。
766 名前:デフォルトの名無しさん [2008/01/14(月) 00:21:01 ] 教えてください int main(void) { char *c1; { char *c2; c1 = StoA(1000); c2 = StoA(2000); printf("c1 : %d\n", c1); printf("c2 : %d\n", c2); } return 0; } このプログラムを実行すると、 なぜかc1の値がc2の値と同じになってしまします。 なぜなのか教えてください。
767 名前:デフォルトの名無しさん [2008/01/14(月) 00:22:24 ] ***追記*** ちなみにStoA関数は数値を文字列に変換する関数です。
768 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:22:35 ] StoAって何だよ
769 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:23:33 ] StoAの中身書いてないわろた
770 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:24:04 ] どうみてもStoAが悪いだろw
771 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:35:00 ] どうみてもStoAが悪い。 あと >printf("c1 : %d\n", c1); >printf("c2 : %d\n", c2); %sちゃうのか? で、同じ数値になるってところからサイコメトリーすると、 グローバル変数かローカル変数辺りの配列のポインタを返してると見た。 コール時にバッファ渡すか、StoAでmallocしてmainでfreeするかしたまい。 StoAを作るのが目的でないならsprintfかitoaでも使え。(個人的にはsprintf) 最後に、C言語で数値を文字列に変換する関数は「ItoA」か「ItoS」な。 StoAだと何してんだか訳分からん。
772 名前:デフォルトの名無しさん [2008/01/14(月) 00:42:07 ] すんません%sでした"汗 StoAはshort型からアスキーコードに変換する関数です。 int main(void) { char *c; c = StoA(123); printf("%s\n", c); return 0; } だと正常に動きます。
773 名前:デフォルトの名無しさん [2008/01/14(月) 00:44:08 ] mainの中にあたらしいブロックを作ってその中で*c1をつかうのがなんかしらダメなんじゃないかなと思うんですが。 作るのが目的ではなくてなぜこうなるのか説明するのが目的なのでよろしくおねがいします。
774 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:45:06 ] いいからStoAの内容書けよ
775 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:46:24 ] >>772 んなこた良いからさっさとStoAのソースを貼れwww
776 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:48:09 ] StoAのソースコードは守秘義務の関係上公の場に貼ることは出来ません。 無茶な要求をしないでください。もう少し常識をわきまえて。
777 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:48:59 ] じゃあ分かりません帰ってください
778 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:49:16 ] 説明するのが目的なのか、説明してもらうのが目的なのかはっきりして欲しいな
779 名前:デフォルトの名無しさん [2008/01/14(月) 00:51:35 ] >>776 その通りです。 ありがとうございます。 >>778 説明するのが目的なので分かりやすく説明してもらえると光栄です。
780 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:55:23 ] とりあえず、StoAのソースを貼る気がないのなら終了で。
781 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:56:15 ] >>779 c1 = StoA(1000); c2 = StoA(2000); printf("c1 : %s\n", c1); printf("c2 : %s\n", c2); ↑で同じ値が出るんだろ?多分両方2000か? c1 = StoA(1000); printf("c1 : %s\n", c1); c2 = StoA(2000); printf("c2 : %s\n", c2); これで同じになるか試してみ。 違う値になるようなら、多分StoAがstatic変数かグローバル変数のバッファ使ってる。 printf("%p, %p\n", c1, c2); で同じ値が出てくるはず。 そうじゃなきゃ、自分でデバッグしてくれ。 ソース無しじゃお手上げ。
782 名前:デフォルトの名無しさん [2008/01/14(月) 01:14:31 ] 正直いいますと今手元にソースが無いのでかけませんが、覚えてる範囲で流れを書きます。 処理@ 引数の桁数を調べる (引数が12345ならiDigに10000を入れておく) 処理A pStrにcStrのアドレスを入れて 数値を文字コードに変換して*pStrに格納。 処理B結果をかえす。 ちなみにcStrはstatic変数です。 わかりにくくてすいません"汗
783 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 01:16:48 ] StoAがわかったら説明してやんよ
784 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 01:18:02 ] そら二回目の呼び出しで cStr の内容を上書きしてるから 同じのが表示されるの当たり前でんがな。 バッファをローカルで持って、引数で渡すといいよ。
785 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 01:36:21 ] ある時間,たとえば10時20分50秒になったらAの動作を行うというプログラムはどう作れば良いですか ひとつの方法としてtimeを使って,現在の時間を取得し続け時間になれば動作する方法 これだとずっと時間を取得し続けるので,良くないような気がするので・・・ ちなみに環境はFedora,gccです.
786 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 01:39:22 ] cron に投げれば
787 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 01:43:59 ] sleep(指定時間-現在の時刻) すりゃいいだろ。 ま、ふつーにcron使えと。
788 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 01:47:34 ] 本人の振りしてあおるのもうやめろよwwwみんな耐性ついてるんだしwwwww
789 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 01:48:44 ] >>786 ありがとうございます.ちょっと調べましたがcronは使えそうです. あとは,外部から動作する時間の変更が行われるので,それが出来るか調べて見ます. 自分のプログラムだけで実現できると一番良いですが・・・
790 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 01:51:44 ] sleepの方法も考えましたが,時間の変更を行うことがあるので実現しにくいと思いやめました やはりcronを使わないとしたらこの2つですかね
791 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 02:02:11 ] コンソールアプリケーションの画面を何も表示されていない真っ黒の画面に 戻したいんですが方法を教えてください。
792 名前:785 mailto:sage [2008/01/14(月) 02:04:17 ] cron調べましたが使えそうです ありがとうございました
793 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 02:04:31 ] OSに依存する
794 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 02:36:42 ] >>791 winだったら、system("CLS");
795 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 02:38:30 ] >>791 win以外ではエスケープシーケンスとか
796 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 04:25:03 ] clearコマンドが使える場合もあるけど、鼬害。
797 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 10:50:14 ] sysytem("cls")だとちらつきがひどいんですが ちらつかないようにって可能なんでしょうか。 もし可能であるならばどうやればいいのでしょうか。
798 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 10:53:06 ] ちらつきって コンソールでゲームでもつくってんのか?
799 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 10:55:58 ] エスケープシーケンスなりCursesなりコンソールAPIなり好きなの使っとけ 細かい制御が必要なら環境かけっつうの
800 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 10:56:23 ] 毎回書き換えが必要な所のみ書き換えるか 全画面を一度に書き換えるか。 どちらにしろ標準関数だけじゃ辛いので、 こういった関数を使うしかない。 msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpfileio/html/Toppage_Console.asp
801 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:26:59 ] ちょっとしたゲームをつくっています。 環境はWinです。 同じ文字列が右から左に移動していき左端にきた文字は消えていくというのをしてるのですが おもったようにちらつきを消すことができまちぇん。。
802 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:40:12 ] >>801 消さずに上書き。 変化の無い部分は書き換えない。
803 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:48:49 ] う、うわがき・・・ 上書きってどう書けばいいのかわかりません。。。。 ちょっとした例示してもらえませんか?
804 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:49:56 ] 消したい文字列と同じ座標にスペースか何かで上書きするとか
805 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:58:06 ] // >>801 #include <stdio.h> #include <string.h> void func(int width, const char * str) { int len = strlen(str); for (int ic = 0; ic <= len; ++ic) { printf("\r%*.*s", width, ic, str); fflush(stdout); sleep(1); } for (int ic = 0; ic < width; ++ic) { printf("\r%*s%*s", width - 1 - ic, ic < width - len ? str : str + ic + 1 - width + len, ic + 1, ""); fflush(stdout); sleep(1); } } int main() { func(20, "abcde"); return 0; }
806 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 12:41:05 ] int main(int argc, char **argv){ FILE *fp; int i, j, a, b; short int image[HEIFGT][WIDTH]; 上のプログラムを一行ずつ何をしてるんですか? a = atoi(*argv[1]); b = atoi(*argv[2]);
807 名前:806 mailto:sage [2008/01/14(月) 12:42:21 ] あと下の a = atoi(*argv[1]); b = atoi(*argv[2]); も教えてください
808 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 12:49:27 ] Windowsでもcurses使えるんだっけか?
809 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 12:54:39 ] >>808 移植はされてると思う。
810 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 12:56:27 ] >>807 プログラムの起動時に渡されたコマンドラインの引数を、数値に変換してるんだけど、それだとバグっていて動かないね。
811 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 14:19:43 ] 806の日本語がバグっとる
812 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 16:12:11 ] 変換前:This 変換後:hisTay 変換前:is 変換後:siay 以下のコードで上のように出力して欲しいのですが上手くいきません 何故でしょうか? int main() { int i; char s[256] = "This is a pen", *word; word = strtok(s, " "); printLatinWord(word); word = strtok(NULL, " "); // wordに"ay"が入る。何で? printLatinWord(word); return 0; } void printLatinWord(char *word) { char *alp; /* 通俗ラテン語風に変換して出力 ※先頭の文字を末尾に移し、その後ろにayを付加する。 */ printf("変換前 : %s\n", word); strncpy(alp, word, 1); alp[1] = '\0'; strcat(word, alp); strcat(word, "ay"); printf("変換後 : %s\n", &word[1]);\ }
813 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 16:29:28 ] >>812 char *alp; ポインタにぶちこむな char alp[1000]; 的な感じにしないと
814 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 16:32:59 ] >>812 strtokは、与えた文字列(この場合s)の中を書き換えながら、そこを指すポインタを直接返す。 たとえば、"This is a pen" を与えると、strtokは最初 "This\0is a pen" ↑ ここを返す。文字列は\0で終わる決まりなので、"This"が得られる。2回目は "This\0is\0a pen" ↑ ここを返す。"is"が得られる。3回目は "This\0is\0a\0pen" ↑ ここを返す。"a"が得られる。 こういう動作なので、帰ってきた文字列に直接strcatで追加すると、 後ろの文字列(=次に返される文字列)が書き換わってしまう。 つまり、そのprintLatinWordを実行すると、sの中は "ThisTay\0a pen" のように書き換わり、次にstrtokが返すはずだった "is" は "ay" になってしまう。
815 名前:812 mailto:sage [2008/01/14(月) 16:42:27 ] >>813 なんとなく*alpになってしまいました まだ違いが良く分かってないので頑張って勉強します >>814 wordを書き換えるとsも変わってしまうんですね。なるほど 丁寧にどうもです *wordをword[256]に、word = strtok(s, " ");をstrcpy(word, strtok(s, " "))に直して上手くいきました
816 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 16:55:04 ] 大学の課題で一部分からない点があるので、よろしければヒントをお願いします。 #include<stdio.h> #define MAX 10 int inputnum(int num[]){ int i; for(i=0;i<MAX;i++){ scanf("%d",num[i]); } return num[]; } int main (void){・・・・・・と続くのですが、 上記のサブ?ルーチンに表記の間違いがある場合、修正せよという問題です。 ですが配列の返し方など全て自習ということでここで止まってます…。 構文にエラーがあるというところまで分かっているのですが、 どうすえればいいか分かりません。ご教授願います。 orz
817 名前:816 mailto:sage [2008/01/14(月) 16:56:30 ] For文が見にくくなってしまいすいません…。 よろしくお願いします。
818 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 16:59:05 ] void inputnum(int num[]) { int i; for(i=0; i<MAX; i++) scanf("%d", num + i); }
819 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 17:00:36 ] >>816 return 0;とでもしておけ 返さなくても渡された中身は書き換わってる なんでかはポインタについて勉強せんと・・
820 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 17:06:48 ] scanf("%d", &num[i]); もでした
821 名前:816 mailto:sage [2008/01/14(月) 17:17:55 ] >>818 ,>>820 丁寧にありがとうございます。 >>819 ということは>>818 の通りvoid宣言でいいのですね…。 後でじっくり調べてみます。ありがとうございます。
822 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 17:21:48 ] int inputnum(int num[], size_t num_size) { int i; for(i=0; i<num_size; i++) if(scanf("%d", &num[i]) != 1) return 0; return 1; }
823 名前:816 mailto:sage [2008/01/14(月) 17:58:20 ] >>822 すみません、「size_t num_size」とは何でしょうか? また戻り値がどこの変数へ戻るのか分かりません…。 また1つ分からない事があるのでどなたかご教授お願いします orz サイズを指定せずに配列を作る事は可能でしょうか? int num[]; //これでは要素が無いためサイズが0であるのでできないということまで 分かりましたがそれ以上で詰まっています。 よろしくお願いします。
824 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:04:39 ] >>823 size_tは型。たぶんunsigned intと同じである環境が多いのかな? 要は自然数用型とか思っとけばとりあえずOK。(サイズにマイナスはないからね) 戻り値がどこに入るかは呼び出し側次第。 int func( void )という関数があったとして main内で「int a = func( );」 としてればfunc内の戻り値がa内に入る。
825 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:06:53 ] >>823 サイズを指定しない配列は無理 malloc系を使えば好きな大きさで確保したり、大きさ変えたりはできるけど
826 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:08:05 ] char s[] = "もけあ"; とかはできるけどそれは宣言のときだけね
827 名前:816 mailto:sage [2008/01/14(月) 18:32:46 ] >>824 詳しくありがとうございます。 int inputnum(int num[], size_t num_size) メインルーチンの方で上の2つの変数の値を指定すればいいということですね。 >>825-826 明確にありがとうございます。 入力する回数を予め決めるか、 要素次第ということですね。大変参考になりました。 皆さんありがとうございました。
828 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:59:16 ] int func(int num){ return !(num%2); } 上記の関数でnumが奇数の場合と偶数の場合の戻り値はそれぞれどうなりますか? 有識者の方宜しくお願いします。
829 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:59:55 ] タメセカス
830 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 19:06:49 ] 算数じゃん。
831 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 19:07:11 ] >>828 何がわからんのだ?%演算子か?!演算子か? 関数や戻り値がわかってるのならどっちかだろうな。 num = 2; num % 2 == 0; !0 == 1 num = 1; num % 2 == 1; !1 == 0; こんなもんでわかるだろ。 ってか>>829 で良かったかな。
832 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 19:08:07 ] 自己顕示欲・・・
833 名前:816 mailto:sage [2008/01/14(月) 21:14:46 ] すみません。また1つ疑問ができてしまいましたのでご教授お願いします… orz 配列inputのサイズ変数MAXをサブルーチンで決定したいのですが、 int MAX; void sub(int MAX){ scanf("%d",&MAX); } int main(void){ input[MAX]; ・ ・ ・ } とした時に、「sub(MAX);」をどこで定義すればいいのでしょうか? それともルーチンではできないでしょうか? よろしくお願いします orz
834 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 21:18:07 ] (^ん^)?
835 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 21:18:29 ] とりあえずC言語における「定義」の意味を調べなおした方が
836 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 21:19:26 ] 日本語でおk MAXの値はどこでも変えられるけど? MAX = 4;とか好きにすれば? それとも配列のサイズ変えたいの?
837 名前:816 mailto:sage [2008/01/14(月) 21:19:52 ] >>833 訂正です、すみません。 void sub(int MAX){ scanf("%d",&MAX); } int main(void){ int MAX, input[MAX]; ・ ・ ・ }
838 名前:816 mailto:sage [2008/01/14(月) 21:22:24 ] >>835 すみません、定義ではなく呼び出しでした。ご指摘ありがとうございます。 >>836 サイズを入力で指定したいのですが、そのプログラムはサブルーチンで記すことが条件です。
839 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 21:25:06 ] >>833 若干エスパー。 丸写しはどーかと思うけど、こういうことか? void sub(int *MAX){ scanf("%d",&MAX); } int main(void){ int MAX; int *input; sub(&MAX); /* int input_NG[MAX] <- これはムリ。配列の宣言では定数しか使えない */ input = malloc(MAX * sizeof(int)); ・ ・ ・ free(input); }
840 名前:816 mailto:sage [2008/01/14(月) 21:37:44 ] >>839 ご回答ありがとうございます。 分かりづらくなってしまい申し訳ございません。 int MAX = 10; int main(void){ int main[MAX]; ・ ・ ・ このように、最初から数値を指定するのではなく、 MAXの値をscanf等の入力で毎回変更することはできませんか? またできる場合、それをサブルーチンでまとめられますか? イメージはこんな感じになります。 scanf("%d",&MAX); int input[MAX]; 何度もすみませんがよろしくお願いします。
841 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 21:53:30 ] >>840 一応そのイメージで839を書いたんだけど・・・。 要はmallocを使いたくない(or知らないので分からない)ってこと? どうしても配列ってことであれば、おそらく分からないだろうけど C89ならムリ。C99なら出来る。 つまりコンパイラによる。 例えば俺が知ってるうちではVCでは出来ない。gccは最近のであれば出来る。
842 名前:816 mailto:sage [2008/01/14(月) 21:53:33 ] >>839 /* int input_NG[MAX] <- これはムリ。配列の宣言では定数しか使えない */ すみませんようやく意味が分かりました。 本当に詳しくありがとうございました。
843 名前:816 mailto:sage [2008/01/14(月) 22:01:13 ] >>841 #include <stdlib.h>とセットでちらっとだけ見た事があるので 調べて分かれば使えると思いますが、分からないということでお願いします。 別のプログラムで指定した値をファイルに出力し、当プログラムで読み込むというような方法はあるのでしょうか?
844 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 22:08:52 ] >>843 とりあえずfopen辺りでファイルの入出力ができるよ(他にもあるけど) それも分からないの?
845 名前:816 mailto:sage [2008/01/14(月) 22:17:29 ] >>844 そこは以前にある程度習っているので復習すればできると思います。 ありがとうございます。
846 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 22:18:52 ] >>843 >調べて分かれば使えると思いますが、分からないということでお願いします。 お願いされてもwww とりあえず十分に大きい固定サイズの配列を用意するか、 mallocを調べるのが良いと思うよ。
847 名前:816 mailto:sage [2008/01/14(月) 22:34:59 ] >>846 >お願いw すみません余計でした^^; >固定サイズ とても参考になりました。 0〜固定サイズまでで値を指定することならできそうです。 ありがとうございました。 時間があればmallocを扱えるようにしたいと思います。
848 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 16:44:03 ] 質問。 ハッシュ法について勉強してるんだけど、格納されたデータ(学籍番号と氏名)を読み取る際に、学籍番号の数(生徒数)を読み取る部分的なプログラムが分かりません。 どういう構文使えばいいでしょうか? 読み込みはこんな感じです↓ /* データファイルの読み込み */ if ((fp=fopen("DATA","r"))==NULL){ printf("File \'DATA\' is not found !\n"); } while ( fscanf(fp, "%d %s", &data_zipcode, data_address) > 0 ) { printf("%d : %s\n", data_zipcode, data_address); /* データの格納 */ if ( StoreData(data_zipcode, data_address) == 0 ) { printf("Hash Table is full !\n"); } } fclose(fp);
849 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 17:05:19 ] >>848 ファイル内のデータの総数を知りたいなら、一回空読みすればよかろ。 つーか、それってハッシュ法と関連するのか?
850 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 17:50:05 ] >>849 ハッシュするための下準備。んで、出来ました。ありがとうございました。
851 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 20:06:23 ] if ((fp=fopen("DATA","r"))==NULL){ printf("File \'DATA\' is not found !\n"); } いっつも思うんだけどさ、これって何したいの? ファイルオープン失敗したまま処理続けるなよ