[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 07/29 12:15 / Filesize : 128 KB / Number-of Response : 591
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 36



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の一回目の判定が無駄だって言ってるんだが理解できてる?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<128KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef