C言語なら、俺に聞け! <9>

このエントリーをはてなブックマークに追加
860デフォルトの名無しさん:01/12/13 19:26
もうここではC言語の質問を出来そうにないな…。
初心者の漏れにとっては、すごくいいスレだったのだが。

「彼のいない」C言語質問スレってある?
もしあるならそこへ行って質問したいんだけど。
>>860
お前がここで聞いて、誰かが答えた時点でその板はもう
「彼のいない」C言語質問スレではない。
徹底的に無視して聞くか、だめなら2ちゃんでは聞くな。
>>860
ホットゾヌを入れて NG ワードに Kusakabe Youichi と指定しろ(メニューバーから [ツール]
- [NGワード設定])。これでヤツの発言は自動的に透明あぼーんされる。
863Kusakabe Youichi:01/12/13 20:23
In article >>860, デフォルトの名無しさん/860 wrote:

> もうここではC言語の質問を出来そうにないな…。

ということにしたいのですね?
864デフォルトの名無しさん:01/12/13 20:25
>>863

:)←これはどうした?
865Kusakabe Youichi:01/12/13 20:34
In article >>864, デフォルトの名無しさん/864 wrote:
>:)←これはどうした?

ということにしたいのですね? :)
866デフォルトの名無しさん:01/12/13 20:34
>>863
そうです。そうしたいです。
それ以外にどの様に読めますか?
867デフォルトの名無しさん:01/12/13 20:35
標準入力から英文を読み込んでファイルに保存したいのですが、
scanf("%s")でfputs関数を使うのと、scanf("%c")でfputchar関数を使うのはどちらがいいですか。
868デフォルトの名無しさん:01/12/13 20:40
かゎぃぃ
869デフォルトの名無しさん:01/12/13 20:42
>>867
どっちでもいいよ。
scanf()は使わないにこしたことはないけどね。
>>867
getchar(), putc()
そもそもCにはfputcharという標準関数は存在しないし、
putcharは標準出力に出力する。

# その機能はcatでもできるような気がするが(゚ε゚)キニシナイ
871867:01/12/13 20:57
>>870
ごめんなさいです。fputc使おうと思ってました。
どっちでもいいのはわかるんですが、一般的にどちらが使われているのか
知りたくて質問しました。
あと、もしstrという配列(バッファというやつですか?)を使ってファイルに書き出そうとしたら、
要素数はどのくらいがいいんでしょうか。
やっぱりstr[256]とか2の倍数がよいのでしょうか?理由は知りませんが…。
糞壁が煮詰まった時に連発する

ということにしたいのですね? :)

ってサッパリ意味がわからん。
何これ、キティ語なの?
>>872
その質問はスレ違い。
マ板の該当スレで聞け。
874デフォルトの名無しさん:01/12/13 21:09
>>871
どこくらいのバッファがいいかは、実際に動かす環境で
実験してみるしかないね。
標準入出力関数を使えば、一応バッファリングはしてくれるから、
そんなにせいいっぱいの性能を求めるんじゃなかったら、
一文字ずつ処理してもいいよ。
875デフォルトの名無しさん:01/12/13 21:12
>>871
最近のマシンなら、1メガくらいとってみるとか。>バッファ
876867:01/12/13 21:13
>>874
ありがとうございます。
レスを読むと、どうも文単位で読み込むのが常識みたいですね。
とりあえずscanf("%s")→putsで作成してみます。
>>871 最高速を狙うなら fread/fwrite を使うべし。
バッファサイズは BUFSIZ を使うのが普通かもね。

だが、普通は getc()/putc()マクロを使えば十分速いです。
fgetc()/fputc() はたぶん一番遅いっす。
>>872

866 に返事を書けないことでわかるが、無意味な言葉。
「ぼく、降参」程度に受け止めておけばよい。
>>876
scanf("%s") 使うぐらいなら、fgets() 使えって。
キケンでなおかつ遅くて良いことないよ。
>>876
> とりあえずscanf("%s")→putsで作成してみます。
scanfでファイルの終わりをどうやって検出しようと思っているのか
小一時間問いつめたい
# まぁ無理すればできなくはないが...
881デフォルトの名無しさん:01/12/13 21:23
>>876
scanfを使うと、シロウトあつかいされますよ。
>>880
戻り値見ろよボケ。
883867:01/12/13 21:28
>>880
ファイルの終わりはctrl+Dで出力します。(UNIX環境です)
学校の自習問題の一部ですので…。

fgets()ならEOFの時NULLが返るので扱いやすいのでしょうか。
でも、これだと先ほどのstr[256]とかしたときに256文字を越える行が
出て来ると処理できないのかと思うのですが。
たとえば260字の行が出てきたら、最後4文字が読み込めないのではないですか?
これが気になってscanfを使おうと思っていたのです。
無知でスミマセン。
884867:01/12/13 21:30
>>881
ほんと素人なので、右も左もわかんないんです。
なぜscanfを使うべきではないのか、理由を教えてもらえないでしょうか?(煽りではなく、マジ質問です)
>>882
それでもバッファオーバランを防止できないんですよ
そこでまたブチギレですよ。
>>884
> でも、これだと先ほどのstr[256]とかしたときに256文字を越える行が
>出て来ると処理できないのかと思うのですが。
fgetsは2回に分けて読めばいいのですが、
scanf, getsだと256文字を越える行が出て来ると
何が起こるかわかりません。
887867:01/12/13 21:38
>>886
あ、二回に分けて読むことができるんですね。
それだとどんな長い文がきても安心できます。

ありがとうございます。
fgets→fputsでやってみることにします。
888デフォルトの名無しさん:01/12/13 21:40
>>884
getchar(),fputc()で一文字ずつ処理したほうが簡単かも。
>>888
ヤーヤーヤー
890867:01/12/13 21:47
ごめんなさい、もうひとつ質問させてください。
標準入力からファイルに書き出す時は、ファイルオープン、ファイルクローズをしなくてもよいのでしょうか?
>>890
> 標準入力からファイルに書き出す時は、ファイルオープン、ファイルクローズをしなくてもよいのでしょうか?
標準入力、標準出力、標準エラー出力は最初からopenされていて、
プログラム終了時にcloseされていることは保証されている。
だから(゚ε゚)キニシナイ
892867:01/12/13 21:55
あ、うまくできました。
レス下さった皆さん、本当にありがとうございました!
bankers algorithmの日本語解説があるとこって知りませんか?
>>885
バッファサイズ指定しろあゴルァ
895デフォルトの名無しさん:01/12/14 02:10
fgetsを使ってファイルポインターを次の行の先頭に持っていっている私は阿呆ですか?
K&Rの演習問題解けた人は
アンサーブックの通りになっていたのですか。

いや簡単なやつなら全く同じになりますが
複雑な方はちょっと
897Kusakabe Youichi:01/12/14 04:09
In article >>880, デフォルトの名無しさん/sage/880 wrote:
> > とりあえずscanf("%s")→putsで作成してみます。
> scanfでファイルの終わりをどうやって検出しようと思っているのか
> 小一時間問いつめたい
> # まぁ無理すればできなくはないが...

そう「無理」はしなくてもいいでは?
898Kusakabe Youichi:01/12/14 04:10
In article >>883, 867/883 wrote:
> ファイルの終わりはctrl+Dで出力します。(UNIX環境です)
> 学校の自習問題の一部ですので…。

その授業ではどんな教科書を使っているのですか?
899Kusakabe Youichi:01/12/14 04:11
In article >>884, 867/884 wrote:

> >>881
> ほんと素人なので、右も左もわかんないんです。

<--こっちが右 こっちが左です-->

# 信用するかな?

> なぜscanfを使うべきではないのか、理由を教えてもらえないでしょうか?

教科書にそんなことも書いてないのですか?
900!f84%3dm2:01/12/14 05:46
> 教科書にそんなことも書いてないのですか?

書いてない教科書多いと思うけど。
901Kusakabe Youichi:01/12/14 09:07
In article >>900, !f84%3dm2/sage/900 wrote:

> > 教科書にそんなことも書いてないのですか?
>
> 書いてない教科書多いと思うけど。

いい教科書を選びましょうね。
902ig:01/12/14 10:33
早速ですが、質問があります。
c言語のキャストについての質問です。
環境は、Solaris2.6&SUNのccコンパイラです。

(intを返す関数へのポインタ)を(longを返す関数へのポインタ)型に
キャストするにはどのようにコードを書けばよいのでしょうか?
---以下、詳しい説明
(longを返す関数へのポインタ)をメンバ変数に持つ構造体
を宣言しました。
仮にこの構造体を
typedef struct {
long (*function)();
} sa;
とtypedefするとします。
その後、.cファイルの中で
sa va[]={{a},{b},{c}}
てな感じで宣言したいのです。
ただし、a(),b(),c()は、intを返す関数として定義してしまって
るんですよね…
だからキャストして{警告: 初期値設定の型が一致していません}
ってな警告を黙らせたいなと思ってます。
903デフォルトの名無しさん:01/12/14 10:38
>>902
typedef int (*int_func)();
sa va[]={{(int_func)a},{(int_func)b},{(int_func)c}}

動作確認してないけど、こんな感じかな?
904ig:01/12/14 10:54
>>903
>>デフォルトの名無しさん
ありがとうございます。

このやり方でコンパイラは黙ってくれました。
ただ、
typedef long (*long_func)();
でしたけども。
>>904
>typedef long (*long_func)();

だね。スマソ。
906デフォルトの名無しさん:01/12/14 11:28
ていうか、日下部がいようといまいと、2chで質問しなきゃ前に進めな
いような奴は最初から見込みないと思う(ゲラ
>>906
話が見えませんが…
908Kusakabe Youichi:01/12/14 12:15
In article >>902, ig/902 wrote:
> ただし、a(),b(),c()は、intを返す関数として定義してしまってるんですよね…
> だからキャストして{警告: 初期値設定の型が一致していません}ってな警告を黙らせ

喇叭を使う :-P
909Cハッカー日下部陽一
黄色信号が出ましたので、新スレを作りました。
早めの移行をお願いします。
http://pc.2ch.net/test/read.cgi/tech/1008300863/l50