1 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 20:06:26 ] malloc(sizeof(char)*(strlen(s)+1)) ではなく malloc(strlen(s)+1) と書くような糞コードばかり見て育った、 悪しき慣習を引きずった人は引退すべし
206 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:14:51 ] >>201 ISO/IEC 14882(C++の規格だ) の5.3.3 Sizeof にこう書いてある。 sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1;
207 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:20:56 ] >>206 いや、お前さんは流れ読めてなさ杉だろ。
208 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:21:29 ] #define sizeof(char) 1
209 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:24:36 ] >>207 >charのサイズが2バイトのC++環境とかだと っていう>>201 の前提がこれで無くなった っていうだけだよ
210 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:25:29 ] >>201 後半 それはない。 そうだとすると、malloc(2)の返すポインタが 要素数2つのchar配列として使えないという意味になるではないか。 mallocが使う単位もまた、sizeofと同じ。
211 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:36:14 ] >>209 sizeofの単位がバイトとはどこにも書いてないだろう
212 名前:201 mailto:sage [2007/08/26(日) 16:36:27 ] >>209 いやいや。だから、規格だと1とは書いてあるけどそれが1バイトを意味するって書いてないよねってはなし。 たとえば1=1ワードとかあり得るわけで。昔とかだと1ワード9ビットとか10ビットのマシンってあったしね。 その1ってなんだ? っていうお話。 sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1; じゃなくて、 sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1 byte; ってかいてあるなら自分の言ってることは間違いってことになるけど。 >>210 そうだよ。だから、規格上ではホントにそれが保証できないって言いたいわけ。 malloc(8)の返すポインタが要素数2つのint配列として使えないのと同じってこと。 mallocが使う単位はbyteでsizeofの単位はC++に限って言うならcharのサイズを1とした環境依存。 実用上同じでないと使い勝手が悪いというのならそれには同意。
213 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:43:08 ] C99ではsizeofの結果はバイト数ってことになってるな。 > sizeof 演算子の結果は、そのオペランドの大きさ(バイト数)とする。
214 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:44:00 ] >>212 The sizeof operator yields the number of bytes in the object representation of its operand. ってわけえ、sizeofはバイト数を返します
215 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:46:07 ] >>201 次のネタどうぞ
216 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:51:06 ] sizeof()の返り値はバイト数 malloc()の引数はバイト数 では、 strlen()の返り値は何? バイト数なら、そのまま+1してmallocの引数に渡すのはOKだが、 文字数なら、sizeof(char)を掛けないと、バイト数にはならないよね。
217 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:56:47 ] The strlen function returns the number of characters that precede the terminating null character.
218 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 17:00:44 ] 1を掛けても掛けなくても数値は変わらないよね
219 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 17:03:15 ] strlenの引数は char* だから文字数=バイト数と考えてよいのでは? それとも漢字が混じるとそれも1文字として扱われるだろうか? だとしたら、sizeof(char)掛けてもバイト数にはならないよね。
220 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 17:03:27 ] >>216 戻り値はキャラクタ数 1キャラクタは1バイト よって戻り値はバイト数 ってことだね
221 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 17:05:29 ] それは数値の一致であって、意味の一致ではない。 あくまでも「1バイト文字」の「文字数」なのだから。 省略してもプログラムは意図した通りに動くが、 プログラムが動けば何だっていいというのは間違い。
222 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 17:15:13 ] 仕様上キャラクタ=バイトです。 たまたま文字を意味するときだけ わかりやすくキャラクタと表記します。 そのため、byte という型はありません。 だってさ。なるほどね。
223 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 17:19:42 ] ?
224 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 18:17:13 ] >>221 1バイト文字の文字数がバイト数と等しいと見なすことの何がいけない。
225 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 18:25:17 ] プログラムのコードに現われない、暗黙の変換を行うから、いけない。
226 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 18:26:25 ] >>225 暗黙じゃないだろ・・・
227 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 18:34:00 ] >>225 こんな自明な事柄、変換じゃないだろ。
228 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 18:42:37 ] 自明だからといって省略するのは、悪い癖だなぁ。
229 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 18:57:07 ] そもそも変換じゃないだろ。
230 名前:201 mailto:sage [2007/08/26(日) 19:23:37 ] >>213 >>214 これは知りませんでした。ご教授ありがとうございます。 たしかにsizeof(char)は常に1で、返すのはバイトサイズだからcharが 2バイトの環境ってあり得ないですね。 勘違いしてました。 >>215 ごめん。 俺の疑問は俺の誤解だったということで解決したから、次のネタはないの。。。 単発と言うことで許して。
231 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:09:02 ] お前ら、こんな下らない話で、よくここまでスレを伸ばしたなぁ。 いまどきmallocとstrlenを散在させるようなコードを書くほうがオカシイ。 strlenなんて使うか? ふつー。
232 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:14:17 ] 最近はもうC自体あんまり使わない
233 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:23:27 ] >>231 話がループしてるからいくらでも伸びる気がする。 ところで、 「散在させる」ってのはどこから出てきた? strlenを使わないなら何を使う?(あくまでCだとして) sizeof(char)を省略すべきでない?
234 名前:!= 231 mailto:sage [2007/08/27(月) 01:25:34 ] ここでstrlen_sだなんて言ってみるテスト
235 名前:デフォルトの名無しさん [2007/08/27(月) 01:28:31 ] >>231 くだらないからこそだろう まさにこれこそが 「自転車置場の議論」 ってやつだな
236 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:35:19 ] >>233 マクロ、ライブラリ、クラスの中で使うのではなく、 ベタベタと書くコードの中で使う = 散在させる ぶっちゃけ、適切に局在化されていれば、 多少マズいコードだろうと直せるので、 このスレで話しているようなことは、 どーでもよくなるんですよ。
237 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:39:54 ] そうだ、マルチバイト文字が存在するからいけないんだ! 今日から、みんな、英語で生活! それで全員ハッピーだ!
238 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:57:57 ] Die job death car?
239 名前:233 mailto:sage [2007/08/27(月) 02:01:15 ] >>236 「散在させる」はスレの流れから読み取ったわけじゃないのね。 俺も同じ考えだけど、ちょっと論点がずれてる気がする。 「局在化」とか、「直せる」とかはこのスレには関係ないな。 局在化したその場所で「省略するかしないか」ってことが問われてる。 まあ、そこで、「どーでもよい」ってのが答えなんだろうけど。
240 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 04:21:09 ] ここで新たな判断基準を持ち込んでみる。 どちらが適切だと思うか主張する場合に、年収も書くこと。 年収の多い人のやり方が、すなわち、より成功に近い。
241 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 06:00:54 ] 馬鹿発生
242 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 09:04:13 ] アホが来たよ・・・
243 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 09:28:33 ] >>231 C言語なら「普通」strlenを使うと思う。 NULL終端までのバイト数を取得する関数なんて作るのは、 まぁライブラリの標準関数が使えないプロジェクトぐらいじゃないの?
244 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 11:19:52 ] 今時charの内部形式を意識しないといけない言語は使うな。
245 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 16:17:20 ] >>243 何かにつけてstrlenする、糞遅くて信頼性の低いプログラム書いてるのか。ご苦労さまです。
246 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 16:20:17 ] 本当、何かにつけてstrlenの必要に迫られるCは疲れるよ。
247 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 16:25:11 ] >>245 C厨だがそこには同意
248 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 17:18:47 ] strlen
249 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 17:23:02 ] struct { size_t bufferLen ; size_t validLen ; char szBuffer[1] ; } ; とかの構造体を使って、バッファの長さや有効長を管理したらいいじゃないか。 szBuffer[1]と言いながら、実際にはヒープから長い領域を貰うのは気持ちわるいかもしれないが。
250 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 17:36:12 ] >>245 自分がそうだからといって人もそうだとは限りません。 間抜けですね。
251 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 18:10:40 ] >>249 そこまでするくらいならC++使う。そもそも使えるときは使っている。
252 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 19:11:38 ] >>250 どんなコードを書いているのか披露してほしい。お手本にするから。
253 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 20:09:30 ] >>245 fgetsで文字列を読み込んだり、コマンドライン引数を受け取ったりした際に 得られた文字列長を調べるための、strlenより高速で信頼性のある方法を教えてくれまいか?
254 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 20:59:09 ] freadを使う
255 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:05:14 ] それはstrlenより高速で信頼性のある方法なのか?
256 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:29:46 ] >>253 まず、得られた文字列の長さを調べる必要が、本当にあるのかな。 次に、何かにつけてfgetsするのかな。
257 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:32:02 ] 必要あるからする
258 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:34:11 ] 本当は必要ないのに、必要だと思い込んでいる可能性を疑ってみた?
259 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:37:49 ] もちろん
260 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:38:54 ] で、strlenより高速で信頼性のある方法は?
261 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:44:29 ] じゃぁ>>253 は具体的にコードを例示してね。
262 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:50:37 ] strlenより高速で信頼性のある方法マダー?
263 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:53:02 ] strlenよりも高速で信頼性のあるstrlen互換の関数の話ではないぞ。
264 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:55:18 ] 基本的に、 気やすくstrlenやstrcpyを使わない ってだけで、かなり速くなるし、安全性も高まる。
265 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:59:45 ] 酷い例1 char buf[100] ; char buf2[100] ; fgets(buf, sizeof(buf), pFin) ; if (strlen(buf) < sizeof(buf2)) { /* 無意味な長さチェック */ strcpy(buf2, buf1) ; /* ←無意味なコピー */ } 酷い例2 for (i=0 ; i<strlen(s) ; i++) { /* 無意味な有限回数のループ、無意味な毎度の関数呼び出し */ if (s[i] == 'X') { なんたら } }
266 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:02:14 ] strlenよりも高速で信頼性のあるstrlen互換の関数マダー?
267 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:07:14 ] >>264 strlen,strcpyの安全性が低く感じるのは、呼び出し元の安全性が低いから。 速くなるってのは、一度取った長さを変数に入れておくとかってレベルの話かな? いずれにしろ、これらに限らず「安易に使わない」って意味では同意できる。
268 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:25:48 ] >>267 > strlen,strcpyの安全性が低く感じるのは、呼び出し元の安全性が低いから。 人間はミスをするものだから、 機械的かつ強制的にチェックしなければ、 意味がない。 バッファの長さが十分であるという、 目に見えない約束なんてものは、 人間のミスには耐えられない。 > 速くなるってのは、一度取った長さを変数に入れておくとかってレベルの話かな? そんな小手先の最適化ではなく、 strlenを本当に必要な場所でしか使わない、ということ。
269 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:28:11 ] 安易に使わないってどゆこと? 必要だから使うんじゃないか。代替手段があるというのか?
270 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:29:30 ] >>269 実際にどんなコード書いてるの? 晒してみなよ。
271 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:30:02 ] 253だが、257とか259とか俺じゃないんだが。 なんか>>261 に指名されたんで、釣られてちょろっと書いてみる。 エラー処理が抜けてるのは行数削減のため。 引数に与えた文字列から始まる行を表示するプログラム。 fgetsでは無くて、引数の文字列長を取得する例なんで、 簡単のために最大255文字。 #include <stdio.h> #include <string.h> #define BUF_SIZE 256 int main(int argc, char *argv[]) { int len = strlen(argv[1]); char buf[BUF_SIZE]; FILE *fp = fopen("test.txt", "r"); while ((fgets(buf, BUF_SIZE, fp)) != NULL) { if(strncmp(argv[1], buf, len) == 0) printf("%s", buf); } } strlenぐらい普通に使うと思うんだけどねぇ。
272 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:32:33 ] なんかボーっとしてる間に、えらいスレ進んでてびっくりだ。 253と271とコレ以外は俺じゃないんで一応。
273 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:36:16 ] >>271 それは 「何かにつけてstrlenする」 には該当しないと思うが。
274 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:37:17 ] >>272 すまんね >>257 と>>259 は俺だ 君の振りをしたつもりは無いんだけどね
275 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:50:29 ] こんなどうでもいいことを真剣に議論してるw ワラタw
276 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:53:27 ] それはよかった
277 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:55:12 ] >>273 >>243 に対して>>245 だったから、strlenを全否定してるように見えたんで、 「まぁ使うんじゃないの?」ぐらいの感じで書いただけだよ。 ループ内とかで同じ文字列に対して何度もstrlen呼んだりとか そういうのは無駄だと思うよ。
278 名前:デフォルトの名無しさん [2007/08/28(火) 22:18:22 ] 結論は出ましたか。
279 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 22:23:56 ] 結論: sizeof(char)は省略してもいい strlenは必要な場合もある
280 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 22:28:44 ] 上げんな糞 >>1 死ね
281 名前:デフォルトの名無しさん [2007/08/28(火) 23:30:57 ] adobePの新作期待age
282 名前:デフォルトの名無しさん [2007/08/28(火) 23:46:39 ] >>1 sizeof(char)が必ず1なら malloc(sizeof(char)*(strlen(s)+1)) ではなく malloc(strlen(s)+1) の方がいい malloc(sizeof(char)*(strlen(s)+1)) だとsizeof(char) * が冗長 sizeof(char)が必ずしも1でないならわかるが
283 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 01:23:30 ] まあCとC++に限って言えば100% 1だからなぁ
284 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 01:26:43 ] いい加減ループしすぎ。
285 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 01:27:14 ] まぁスレタイがねループしてくださいって言ってるようなもんだからね
286 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 01:29:27 ] ループといえば for(;;) と while() の戦争もあったな オレは意味なくdo〜while派だけど
287 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 01:38:39 ] じゃあ俺はgotoを使うぜ!
288 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 01:41:03 ] 三木は3つまでしかまとめられなかったので 3岐 後藤は5匹を統括してたから 5統
289 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 06:16:09 ] ナツカシス
290 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 06:40:54 ] ネオジオは100メガビット
291 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 07:43:01 ] >>288 三木は右手だからじゃなかったっけ?
292 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 11:02:31 ] それもあるな なんかこう言葉遊びもあそこまで行くと芸術レベルだよな
293 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 13:07:42 ] >>284 今頃ノコノコ出てきて画期的なご意見を述べて行かれる >>282 みたいな間抜けがいる限り、ループは不滅です。
294 名前:デフォルトの名無しさん [2007/08/29(水) 21:26:11 ] exit(0);
295 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 21:49:41 ] いまどきマロックなんか使うかよw newを使えnewを!
296 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 22:22:16 ] VirtualAllocは多用しますが何か?
297 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 23:13:24 ] sizeof(char)+1が必ず2でも、省略すべきではない pc11.2ch.net/test/read.cgi/tech/1187521586/
298 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 23:20:02 ] 再帰
299 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 19:28:14 ] おもしろいことに、関心と一般の議論の大きさは、 機能の重要性と反比例していることが多い。 その理由は、大きな機能より小さな機能のほうが明確な意見を持ちやすく、 流行のような、一時的な関心を引きやすいからだ。 〜〜Bjarne Stroustrup『C++の設計と進化』
300 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 22:41:51 ] >>299 そして、プログラムとは、小さな機能を集めて大きな機能を実現していく。 だから、小さな機能を議論することは、最終的に大きな機能 そして、重大な機能を議論することにつながるのである。
301 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 23:39:17 ] ああいえば上祐
302 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 00:56:46 ] ttp://msdn2.microsoft.com/ja-jp/library/xa1a1a6z(VS.80).aspx 世界一巨大なソフトウェア会社のコーディング例では、 len = _vscprintf( format, args ) // _vscprintf doesn't count + 1; // terminating '\0' buffer = malloc( len * sizeof(char) ); のように、sizeof(char)を省略していない。
303 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 01:34:46 ] dist.dc.kumamoto-u.ac.jp/~km3534/12/index.html の問題2 「自分なりの理由」があればどちらでも良い。 という答えな気がする。
304 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 01:41:50 ] >>303 純真な若者に示す手本として、 s = (char *)malloc(sizeof(char)*n + 1); というのは、随分と酷いな。 s = (char *)malloc(n + 1); ならともかく、 s = (char *)malloc(sizeof(char)*n + 1); はダメだろう。 意味として間違ってる!
305 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 01:50:23 ] >>304 まあね、書くのならこのスレの様に sizeof(char)*(n+1) のようにヌル文字分も含めるべきだね。
306 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 01:53:05 ] >>303 どうしようもない問題集だな。特に問題4の辺りは終わっている。