- ベストアンサー
Objective-C++はこんな仕様なのでしょうか?
Objective-C++はこんな仕様なのでしょうか? char s1[] = "abcdefg"; char s2[16]; strncpy(s2, s1+2, 2); NSLog(@"s2=[%s]", s2); としたところ、s2は s2=[cd]とならずに s2=[cd何か変な文字・・・] となり、どうも最後にNULLが付加されていません。 memset(s2, 0, sizeof(s2)); // わざわざクリア strncpy(s2, s1+2, 2); の場合は、 s2=[cd]となりました。 Objective-C++はこんな仕様なのでしょうか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
CではNULL=0とは限らないので、それで憶えてしまっているとうっかり変なものを踏む可能性があります。 C++ではNULL=0なのでC++でしか組まないと言うのなら特に気にすることはありませんが、概念的にはNULLとヌル文字は別としておいた方がいいのは事実です。 まぁそれはさておき、ローカル変数は初期化されないというのも、strncpy()がヌル文字を付加しないというのもCの頃から一貫しています。 別にObjective-C++だからそうって訳ではありません。
その他の回答 (5)
- Tacosan
- ベストアンサー率23% (3656/15482)
「Objective-C++」ってなんだ.... Objective-C と C++ がまざっちゃってるぞ.... さておき, それは「C における『文字列』の仕様」と「strncpy の仕様」の両方による. ちなみに「NULL の値」は考えても無意味. ・「いかなるオブジェクトもささないポインタ値」として「ヌルポインタ値」がある ・ポインタ値が必要な場面で「整定数の 0」が表れたら, それは「ヌルポインタ値」と解釈される と理解してほしい. 「ヌルポインタ値」が実際にどのようなビットパターンとして格納されるかは処理系に聞いてくれ. 以下余談: 非常に細かいところだと '\0' と書いたときに C では int の 0 になるのに対し C++ では char の 0 になるという違いはある... けど, 結局どちらもほとんどの場合で「int の 0」になる. とはいえ, 「0」と「'\0'」ではやっぱり「読んだ人の見方」が違う.
- YUI_AI
- ベストアンサー率45% (303/661)
No1です。 NULLと'¥0'の違いは存じておりますが、初心者の方には判り辛いかと思いその様な記述をしておりました。(汗!) ※コードは一緒なので。
- tyatsumi
- ベストアンサー率58% (30/51)
ちなみに、普通にCの文字列として扱うのであれば、あらかじめ全部を\0で埋めなくても、 文字列の最後に1個だけ\0を入れればよいでしょう。 strncpy(s2, s1+2, 2); s2[2] = '\0';
- asuncion
- ベストアンサー率33% (2127/6290)
質問者さんも#1さんも大きな勘違いをされているようですね。 NULLは、'\0'のこと「ではありません」。
- YUI_AI
- ベストアンサー率45% (303/661)
C言語の標準関数である「strncpy」の仕様がそうなっています 上記の様な関数は、自動的にNULL('\0')を付加しないので自分で追加してあげる必要があります。 参考URL http://www9.plala.or.jp/sgwr-t/lib/strncpy.html
お礼
話の流れがNULLにそれてますが、 C++では NULL 0と定義されていると思うので、 NULLと '\0'は違うという意味はわかりません。