1 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:40:35 ] C言語の入門者向け解説スレです。 教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題を片付けます 115代目 pc11.2ch.net/test/read.cgi/tech/1217741118/ ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ・開発環境や動作環境も晒すと答えが早いかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 35 pc11.2ch.net/test/read.cgi/tech/1219761846/ 過去スレ makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
231 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 23:14:08 ] >>229 混同はしてはいけないけど、定義も宣言であるから、 文脈によってはどちらを使っても正しい表現になる場合もある。 どちらを使っても良い場合があるという事から、すなわち混同してよいと解釈したわけ? やっぱり日本語が理解出来て無いようだね。
232 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 23:26:46 ] /* * A function is only defined if its body is given * so this is a declaration but not a definition */ int func_dec(void); /* * Because this function has a body, it is also * a definition. * Any variables declared inside will be definitions, * unless the keyword 'extern' is used. * Don't use 'extern' until you understand it! */ int def_func(void){ float f_var; /* a definition */ int counter; /* another definition */ int rand_num(void); /* declare (but not define) another function */ return(0); }
233 名前:232 mailto:sage [2008/09/21(日) 23:42:20 ] 宣言(declaration)は使用を宣言(declare)すること 定義(definition)は変数やマクロや関数のボディを定義(define)すること ではあるまいか?
234 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 23:43:45 ] だから場合によってはひとつで両方兼ねてたりするだろ?
235 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 00:13:30 ] Cの用語としては、もうちょっとちゃんと記述されていて、 JISより抜粋。 >識別子の定義(definition)とは、宣言のうち次のものをいう。 >・オブジェクトに対しては、そのオブジェクトの領域を確保する宣言 >・関数に対しては、関数本体を含む宣言 >・列挙定数または型定義名に対しては、その識別子の(唯一の)宣言 余談だけど、C++だとまたもうちょっと違う。
236 名前:デフォルトの名無しさん [2008/09/22(月) 08:50:57 ] (func1) register キーワードのついた別々の変数を用いる (func2) a, b を array[0], array[1] に置き換えた以外は func1 と同じ このような時,func1 と func2 の振る舞いは変わりますか? int func1(void) { register int a, b; 何か a, b をたくさん使う処理 } int func2(void) { register int array[2]; 何か array[0], array[1] をたくさん使う処理 }
237 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 10:37:59 ] >>236 振舞いは変わらない。それで変わったら困るでしょ。 func2の方は最適化が阻害されて遅くなるコンパイラとかあるかもね。
238 名前:デフォルトの名無しさん [2008/09/22(月) 16:16:39 ] >>231 やっと少しお勉強してきたようだな たったそれだけのために何時間かかってるんだよ ぼけ 文脈によってはなんて逃げてないで、どういう場合かはっきりしろ 現状、その逃げによって意味をなしていない >ある種の宣言を特別に定義と呼ぶだけなので、 >宣言と言ったところで別に問題ないと思う。
239 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 16:38:50 BE:417694526-2BP(0)] × はっきりしろ ○ 教えてくださいお願いします
240 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 16:52:09 ] >238 お帰りください
241 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 16:53:00 ] >>240 お前が帰れカス
242 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 16:56:21 ] >たったそれだけのために何時間かかってるんだよ これはひどい >>238 お前さんこそそんな支離滅裂なレスを考えるのに17時間もかけたのかい てなことになるな
243 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 17:09:28 ] >>236 registerストレージクラスをどう解釈するかは処理系依存なのでなんともいえません。
244 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 17:45:22 ] >>243 くわしく
245 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 17:58:35 ] 疑問に思ったら、自分の使ってるコンパイラでアセンブラ出力してみるのがいいよ。
246 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 18:20:18 ] foo bar[row][col]; bar[r][c] = hoge; ↑これって foo bar[row * col]; bar[r * col + c] = hoge; に等しいのか、それとも foo (bar[col])[row]; (bar[row])[col] = hoge; なのか、どっちなんでしょう? あと下のbarにsizeofするとsizeof(foo) * row * colに等しくなります 下のやつはbar[col]へのポインタの配列だから sizeof(foo*) * rowになると思うのですがなぜこうならないんでしょうか?
247 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 18:22:03 ] >>244 詳しくも何も、規格票には「アクセスを可能な限り高速にすることを示唆する」とかなんかしか書いてなくて、 レジスタに割り当てろとも、アクセスを高速にしろとも要求されていない。
248 名前:デフォルトの名無しさん [2008/09/22(月) 18:26:58 ] >>242 即レスがトレードマークな常駐野郎にしては遅かったから変だと思ったんだよ
249 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 18:28:54 ] >>246 配列はポインタではない。キミは何かを勘違いしてる。 次の3つは等しい: foo bar[row][col]; int (bar[row])[col]; typedef foo foos[col]; foos bar[row]; これは縦と横が反対になっている: foo (bar[col])[row]; これは明らかに違う: foo bar[row * col];
250 名前:249 mailto:sage [2008/09/22(月) 18:30:23 ] >>249 書き間違えた × int (bar[row])[col]; ○ foo (bar[row])[col];
251 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 18:35:30 ] >>246 >下のやつはbar[col]へのポインタの配列だから 違うよ foo (bar[col])[row] は foo[row] が col 個の配列 つまり foo bar[col][row] と同じ foo[col] へのポインタ row 個の配列が欲しければ foo (*bar[row])[col] と書くけど、普通使わないと思うよ foo へのポインタを row 個持つ配列 foo *bar[row] の方がよく使う
252 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 18:40:17 ] >>247 今はregister付けても大体無視されるよな
253 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 20:02:14 ] >>247 いやそうじゃなくて、それで函数の振る舞いまで変わるの?
254 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 20:06:25 ] >>252 「無視されます」とかドキュメントに明記してあったりな。 それでも C ではまだ & 付けれないという差があるが、 C++ では & 付けれるようになったんだよな。
255 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 20:12:51 ] >>253 変わるわけない >>243 が質問の内容を勘違いしてるだけ
256 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 20:25:01 ] そもそも「振る舞い」って何なの? 関数の結果ことなのか、CPUが演算する内容なのか。
257 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 20:55:38 ] >>253 未定義動作だから何が起こっても不思議じゃないだろ。
258 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 21:00:28 ] >>257 処理系定義と未定義動作は別です。 register変数がどう解釈されるかは処理系定義です。
259 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 21:06:07 ] >>257 register付けたら未定義動作ってどんな罠だよww
260 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 21:13:54 ] >>258 register付きの配列にsizeof以外の演算子が使えることは保証されていない。
261 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 21:34:53 ] C99なら(ry
262 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 22:00:47 ] >>260 なるほどね でもそれだったら「処理系依存なのでなんともいえない」じゃなくて 「未定義だから結果は予想できない」が正しい答えだね
263 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 22:02:12 ] 何がなんでもケチつけたいんだね
264 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 22:05:31 ] 要するにコンパイラの解釈うんぬんは関係なくて「配列にregisterつけんなボケェ」でFA?
265 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 22:07:08 ] こまかいことにこだわるのがプログラマー
266 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 22:08:51 ] >>264 「入門篇で聞くなボケェ」だと思われ
267 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 22:13:08 ] 入門じゃ無い方のCスレ、どっか行っちゃったからなぁ
268 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 22:22:07 ] 【初心者お断り】ガチ規格準拠C専用スレ Part133 pc11.2ch.net/test/read.cgi/tech/1201153965/
269 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 22:22:24 ] >>260 そうなんですか!知りませんでした どうもありがとうぐございます
270 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 22:37:22 ] コンパイラで最適化してくれるから、registerは使わなくてもいい
271 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 22:51:15 ] >>270 馬鹿は黙ってろ
272 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 23:02:44 ] registerは最適化が進んでいなかった大昔のコンパイラの名残だよ 人間の体でいったら盲腸のようなもの 組み込み系用のマイナーなコンパイラを使っているんなら別だが
273 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 23:14:46 ] ( ・∀・) (´・ω・ ≡ ・ω・`) (・∀・ )
274 名前:デフォルトの名無しさん [2008/09/22(月) 23:33:46 ] いざ、それを使う期に及んではマイナーかメジャーかって問題じゃあんめえ
275 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 01:31:14 ] 入門者が使う必要は無い でいいでしょ
276 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 05:59:28 ] 知識が昭和世代の古い人がいるみたいだね。
277 名前:デフォルトの名無しさん [2008/09/23(火) 06:49:20 ] 入門者が使う必要のない機能はない そいつが入門者を卒業するためにはできることからやってみるのみ
278 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 07:17:40 ] C99における可変引数マクロの、##の文字列連結についてお伺いします。 環境はGCCです。 #define a(fmt, ...) fprintf(stderr, "%s():: " fmt, __func__, __VA_ARGS__) #define b(fmt, ...) fprintf(stderr, "%s():: " fmt, __func__, ## __VA_ARGS__) a("x=%d", x);と書いたときは、「fmt」が「"x=%d"」、「...」と「__VA_ARGS__」が「x」に対応するので、 fprintf(stderr, "%s()::" "x=%d", __func__, x); と置換されますが、 a("x")と、引数を1つだけしか書かなかった場合には、 fprintf(stderr, "%s()::" "x", __func__, ); とfprintfの引数リストがカンマで終わってしまいコンパイルエラーになります。 そこで、b(fmt, ...)のように##演算子を使うと、問題のカンマが取り除かれるらしいのです。 ##は「パラメータ置換後に、両側の空白文字とともに各##も削除されて、 隣接するトークンが連結され、新しいトークンが形成される」、と K&R第2版で書いてあるのですが、カンマも取り除かれるようになったのでしょうか? それとも、これはGCCで通じる特別なものなのでしょうか? 長くなりましたが、よろしくおねがいします。
279 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 13:30:25 ] __VA_ARGS__でぐぐれ
280 名前:デフォルトの名無しさん [2008/09/23(火) 15:41:46 ] intなどの値をcharのような1byte区切りの配列として扱うには キャストを使うことができるでしょうか? 実際にやりたいのは 色々なデータのサイズをネットワークバイトオーダーに変えてから 0のバイトを省略して送りたいのです 例えば 00 ab 00 cd ならば ab 00 cd としたいのです 宜しくお願いします
281 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 15:45:03 ] int a に対して ((char *)&a)[1] とかやればいい
282 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 15:56:09 ] char a = (char)(x >> 24) char b = (char)(x >> 16) char c = (char)(x >> 8) char d = (char)x
283 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 15:57:39 ] シフトするならシフト幅はCHAR_BITから計算したほうがいい。
284 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 15:59:04 ] つhtonl
285 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 16:15:15 ] >>278 GCCの拡張です。 gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html#Variadic-Macros
286 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 16:35:06 ] >>280 >>281 のようにポインタ使うのでもいいし何度も宣言するようなら共用体使うとか
287 名前:デフォルトの名無しさん [2008/09/23(火) 17:08:55 ] 宿題臭がする
288 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 17:13:39 ] 00を取ったら可変長になるわけだけど、プロトコルとかどうなってるんだろう。 1バイトに縮めば、長さを別に持っていても節約にはなるか。
289 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 18:14:15 ] >>280 それだとデータの内容が変わってるけど問題は無いの? 送信時に 03 ab 00 cd みたいに長さ情報を付加するの? かなり高い確率で、受信側で次に送る送信データと連結されてしまうよ
290 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 18:45:30 ] >>281 >>282 >>283 >>286 みなさんありがとうございます 共用体も初めて聞くので調べてみます >>284 htonlの後出力する段階でどうしたらいいのかわからなくて >>287 宿題ではありません 個人的にサーバープログラムを書いています Cで本格的なプログラムを書くのが初めてなので >>288 >>289 00 00 ff ab 00 cd みたいな感じで特定のバイト列でサイズのサイズを表し 可変長にしようと考えてます
291 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 20:25:25 ] 他の既存のプロトコルがどうやってるのか勉強したほうがいい
292 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 20:45:45 ] >>291 具体的な例を教えて頂けるとありがたいです RFCの有名どころくらいしか知らないので
293 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 21:26:07 ] >>290 頼むから、そのサーバソフトはLAN内でのみ使ってくれよ。
294 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 21:26:11 ] UTF-8形式っていう手もあるよ可変長 負の値が送れないけど
295 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 21:28:40 ] バイナリのプロトコルでしょ?
296 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 21:33:14 ] 可変長で任意のビット数送るのにも使えるということを言ってるのでは
297 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 21:36:59 ] >>296 ああ、なるほど。
298 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 21:40:58 ] >>290 元データ 00 ab 00 cd ゼロサプレスしたデータ 00 00 ff ab 00 cd 長くなってるよ
299 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 21:49:01 ] まぁ別にその辺はプロトコルの話で、 C言語とは関係無いじゃん
300 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 22:43:23 ] 見た目の圧縮が目的ではないので長くなって構いません 理論的に大きさに制限の無いデータを全部受け取らなくても サイズを知ることができるデータ構造が欲しいのです そのような実例があったら是非教えて頂けると嬉しいです 例えばSMTPなんかは改行などが現れるまでデータの大きさが判りません 拡張でSIZEがありますけどサイズ自体が文字列だから 結局その大きさが判りません 無駄になるかもしれないデータを健気に受け取るより 最小のデータ受信で受け取るか判断できるようにして トータルで無駄を無くす仕組みにしたいのです >>294 >>296 ありがとうございます UTF-8調べてみます >>293 初めてのプログラムですしいきなり誰かに使ってもらうつもりは 毛頭ありませんが他の人に見てもらいたいと思って 真面目に取り組んでいるので 宜しければどの辺が駄目か御教授頂ければ幸いです
301 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 22:45:07 ] >>299 すみません 話し逸れてました 他で相談します
302 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 04:35:53 ] ヘッダにある構造体を定義して、何個かint型の変数を定義しました でも一番上に定義した変数だけ思ったとおりになってくれません 最初にその変数を使うときはおもいどおりの数なんですが 二度目以降からなぜか中身が変わってしまいます 変数名を変えてみたりしてもダメでした なぜか一番上に定義した変数だけなんです どういう可能性がありますか?
303 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 04:39:32 ] >>302 その構造体を晒してみて あと、環境とかも
304 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 04:54:50 ] BCC DeveloperでDXライブラリ使ってます 構造体は struct STATUS_D{ int w_x; int w_y; int pc_x; int pc_y; int pc_sx; int pc_sy; int menu_x; int menu_y; int data_x; int data_y; int time_x; int time_y; int m_x; int m_y; int c_size_x; int c_size_y; char menustr[5][STR_MAX]; int menu_num; int w_handle; int wb_handle; int c_handle[5]; int c_handle_num; }; です この一番上のint w_x;の値が変わってしまいます
305 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 05:13:31 ] >>304 構造体自体には問題ないね。きっとどこかでメモリ破壊をしているんだろう。
306 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 05:45:18 ] メモリ破壊してる所見つけるコツみたいなのあります? 全然わかんないです・・・
307 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 05:48:35 ] >>306 前後に文字配列を定義してないですか?
308 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 05:51:55 ] >>307 それよりこの構造体をどういう風にメモリに確保するか でも変わるしなあ。 たとえば構造体を配列にしてるとなると構造体内部の配列の 最大値をちゃんと管理してなくてメモリ破壊してるとか。 ただ構造体に情報をセットするのは構造体の先頭の領域から なら見かけ上正常に動いてるようにも見える。
309 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 05:55:22 ] 目視デバッグ
310 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 06:08:33 ] デバッガーでトレース 構造体のint w_x;の値を表示しておき、ステップ実行で値が変わったところを調べる
311 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 10:38:33 ] その構造体すでにfreeしてしまっているとか
312 名前:マジレスチュウ ◆MaJi/01g.w mailto:sage [2008/09/24(水) 12:54:50 BE:1465733467-2BP(0)] char型の配列周りが基本的に怪しいよね。 ちゃんとヌルターミネートされてるか、 配列のサイズよりも大きいものを入れる可能性がある場所はないか。 デバッガあるなら>>310 の方法で探すのが早いかな
313 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 19:34:37 ] #ifdef _DEBUG #include <stdio.h> //for sprintf #endif _DEBUGってなんですか?
314 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 19:39:57 ] ttp://www.wakhok.ac.jp/~kanayama/C/03/node112.html
315 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 20:47:47 ] >>313 VCではデバッグモードでコンパイルすると _DEBUGが暗黙のうちにdefineされる。
316 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 00:48:54 ] fgets(str, BUFSIZE, stdin); len = strlen(str); if(str[len - 1] != '\n') { printf("input line may be imcomplete\n"); while(str[len - 1] != '\n') { fgets(str, BUFSIZE, stdin); len = strlen(str); } } whileでstrの未処理の値を読み捨てているらしいけど、そこがしっくりこないんだが。 fgetsで読み捨てるって、具体的にどういう処理だ?><
317 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 00:53:57 ] >>316 モードが何かは知らんけど、読み捨てるって一定条件に達したら その後データが存在してても読まないだけじゃないの?
318 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 00:54:24 ] サイズをオーバーしたとき でもその処理そもそもエンターで入力終了と決め込んでるという点がダメな気もする
319 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 00:55:02 ] 316のはよくない例だな
320 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:01:28 ] すまん、学校の宿題というかプリントに乗ってるプログラムなんだ><w 実際は char str[BUFSIZE]; char dummy[4]; int a = 0, b, len; while(a >= 0) { printf("a, b = ? "); fgets(str, BUFSIZE, stdin); len = strlen(str); if(str[len - 1] != '\n') { printf("input line may be imcomplete\n"); while(str[len - 1] != '\n') { fgets(str, BUFSIZE, stdin); len = strlen(str); } continue; } if(sscanf(str, "%d %d %3s", &a, &b, dummy) != 2) { printf("input format may be imcomplete\n"); continue; } printf("a = %d, b = %d\n", a, b); } こんななってる。安全な入力方法の一つだそうで。 オーバー時のwhileの処理は、未処理のまだ残っている値のクリアが目的らしいんだけど、 fgetsでどうクリアするのかがよくわからん><
321 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:04:18 ] BUFSIZE以上の文字数が入力された場合にBUFSIZE-1で割った最後のあまりのみを有効にする、 かなり頭の悪いやり方。
322 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:11:01 ] continueがあるから違うだろ。 while(getchar()!='\n')で十分な気はするが。
323 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:17:36 ] >>322 そうそう、それでもいいって書いてあった。 あれか、未処理だった部分がstrに入ってくるんかね? んで、未処理だった値も処理されてクリアってこと?><
324 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:21:37 ] もし想定してるよりも長い文字列が入力されてれば 読み込みきれなかった分までstrに上書きしながら 順次読み込んでいって、以降するはずだった処理は 全部ぶっ飛ばしてまた最初からと言う方法を取ってる
325 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:26:05 ] ifの直後に同じ判定をwhileでするのは無駄だと思うけどな。 こういうときこそdo{}while使ってやれよw
326 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:28:40 ] >>324 ありがとうございます、なんとなく解りました。
327 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:32:44 ] >>325 ちゃんとみろ、それは的外れだ
328 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:35:20 ] >>327 if内に進んだ最初のwhileの判定はifでしたのとまったく同じだけど?
329 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:42:13 ] >>328 お前continueが見えてないの?
330 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:43:26 ] >>329 この話にcontinue関係ないw
331 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:48:29 ] >if(str[len - 1] != '\n') { これと >while(str[len - 1] != '\n') { これの条件判定が同じで、whileの一回目の判定が無駄だって言ってるんだが理解できてる?