- ベストアンサー
C言語で構造体メンバがNULLかどうかを判定するサンプル
- C言語で構造体のメンバがNULLかどうかを判定するサンプルを作成しました。
- 構造体のメンバがNULLかどうかを判定するために、指定した構造体のメンバが0x00であるかどうかを比較し、結果を出力します。
- このサンプルでは、構造体のメンバであるnameがNULLかどうかを判定しています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
1)先頭が'\0'でない文字列をmemcpy()したのだから、*st_test.nameは'\0'でないのに 決まっている。そもそも'\0'との一致判定をすることに意味があるのかどうか。 2)標準関数のプロトタイプ宣言を行なっているヘッダーファイルをインクルードしていない。 3)&buf[0]はbufと省略できる点を理解しているかどうか。 4)memcpy()で、文字列終端を含めて11バイトのデータを10バイトの領域にコピーしている。 プログラムの仕様として正しいかどうか。 5)#1さんの回答のとおり、NULLと'\0'との違いをじゅうぶん理解できているかどうか。
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
ポインタp に対して *p と p[0] は同じ.
補足
>ポインタp に対して *p と p[0] は同じ これが理解できていなかったのが問題でした。p[0]~p[n]までループして一つずつ0x00にて 比較すれば良いという事になりますね。もしくは空バッファを用意してmemcmpでもいけそう ですね。
- zwi
- ベストアンサー率56% (730/1282)
>memcpy(&st_test.name[0],"aabbccddee",sizeof(st_test.name)); サイズ決め打ちの転送だが、短いデータをコピーする場合無駄が出る。場合によってはアクセス例外が出来る可能性もある。 >4)文字列終端は入れない想定です。 文字列終端がない場合、strcpy等は使えないしstrlenも使えない。じゃあ文字列の長さは持たなくて良いのか? あとbufが何のためにあるか分からない。
補足
>サイズ決め打ちの転送… 文字列終端が無いためmemcpyでサイズ指定で項目移送する必要があります。 >文字列終端がない場合、strcpy等は使えないしstrlenも使えない… 領域のサイズ分データが入る設計です。電文に乗せたりするデータですので、strcpy等は使用しません。 >buf 不要です。
- jacta
- ベストアンサー率26% (845/3158)
NULL(空ポインタ)とナル文字はまったく別の概念です。 実際にはどちらの判定をしたいのでしょうか?
補足
ナル文字の判定が行いたいです。
補足
1)*st_test.nameだとst_test.name[0]しか比較対象にならないのですか? 2)インクルードは省略して記載しています。 3)ポインタである事を明示的にするためにあえて&buf[0]と記載しています。 4)文字列終端は入れない想定です。 5)確かにNULLポインタと'\0'を混同していました。