雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。
strncat関数がおかしいぞ!?
本家の板にて、うっちゃんが発見した挙動不審部。
以下がそのソース。
char* strncat (char *d, const char *s, size_t sz) { char *tmp = d; while ('\0' != *d) d++; while ('\0' != *s) { if (0 == sz) break; sz--; *d++ = *s++; } if (sz) *d = '\0'; return tmp; }
アドバイスの検証
はいそうです! アホなんで書かないとわかんないんです〜 orz
なぜこうなるのか?について、うっちゃんが丁寧に教えてくれたのだ♪ http://osask.net/v/index.php?topic_id=16#post_id239
while ('\0' != *d) d++;
これはなにをやってるのか。文字列sのオケツにポインタを進めていると。(仮に文字列の途中に0x00があれば、そこをオケツとするわけ。
char str[4] = { 'a', '\0', 'H', '\0' };
文字列str | |||
0 | 1 | 2 | 3 |
'a' | 0x00 | 'H' | 0x00 |
↑ |
上記のwhileによってこういう状態になって、次の処理に移る・・・
文字列str | |||
0 | 1 | 2 | 3 |
'a' | 0x00 | 'H' | 0x00 |
↑ |
while ('\0' != *s) { if (0 == sz) break; sz--; *d++ = *s++; }
文字列sはこうなっている。
文字列s | |||
0 | 1 | 2 | 3 |
'b' | 'b' | 'b' | 0x00 |
↑ |
szが1なので、whileループは一回だけ処理される
//szは1
while ('\0' != *s) { ↑ if (0 == sz) │ break; │ sz--; │ *d++ = *s++; │ } │ │ //szは0 │ //よーし!ループするぞ! └────────┘
//szは0 ┌──┐ while ('\0' != *s) { │ │ if (0 == sz) │ │ break; │ │ sz--; │ │ *d++ = *s++; │ │ } │ │ │ │ //szは0 │ │ //よーし!ループするぞ! │ └────────┘ └──────────┐ ↓ //なんだSZはもうゼロじゃん。なにもせんで次へ・・・
Last-modified: 2024-01-06 (Sat) 22:39:12 (JST) (309d) by hideyosi