str == NULL
とstr[0] == '\0'
の違いを知りたい:
int convert_to_float(char *str, double *num)
{
if ((str == NULL) || (str[0] == '\0'))
return(-1);
*num = strtod(str, (char **)NULL);
return(0);
}
Linuxでgccを使用しています。
str
は実際には「文字列」ではなく、char
(文字列の一部)が存在するメモリ位置へのポインタであることを覚えておくことが重要です。 ) 保存されています。
次に、コンパイラがこれらすべての項目をどのように認識するかを理解する必要があります。それらのタイプを見てみましょう:
str
のタイプはchar *
です(文字通り、「char
へのポインター」)NULL
はnullポインタ定数です(少なくとも私のシステムでは、((void*)0)
です)'\0'
は文字定数です(実際にはタイプint
ですが、心配する必要はありません。通常、char
値を必要とするコンテキストで使用されます)*
およびchar *
のvoid *
を参照してください。これは、これらがポインター型であることをコンパイラーに通知します(これは、この型の変数が値を保持せず、値を指すだけであると言うための空想的な言い方です)。したがって、コンパイラがchar *str
を検出すると、*str
またはstr[0]
(どちらも同じことを実行します)のようなことを要求する可能性があることがわかります。それについては後で説明します。
Cプログラムでstr
を書き込むと、コンパイラは "str"と呼ばれる変数がメモリロケーション(0x0001など)に格納されていることを認識します。それが生成するコードは0x0001に行き、値をフェッチします。そのように、あなたが何かをするなら
str + 1
次に、コンパイラーは次のようなコードを生成します。
fetch the value from where str is stored (0x0001)
add 1 to that value
それはあなたが知っていると私が確信していることです。したがって、この行が何を言っているかは明らかです。
str == NULL
NULL
はnullポインター定数なので、その行はstr
がnullポインター(つまり、何も指していないポインター)かどうかをテストします。
したがって、コンパイラは通常、次のようなコードを生成します。
fetch the value from where str is stored
check if that value is 0
よろしければ、str
は実際にはポインタ型であることをコンパイラに伝えたことを思い出してください。したがって、これを書くことができます:
*str
そしてそれはコンパイラにこれを生成させます:
fetch the value from where str is stored
now use that value as a memory address and fetch what is stored there
したがって、strが0x0200を保持している場合、メモリアドレス0x0200から値を取得します。コンパイラは、文字列が実際にそこに格納されているかどうかを実際には気にしないことに注意してください。
(str[0]
は*str
と同じであることを知っていると想定します。これにより、何が起こっているのかを簡単に説明できます。)
では、これはどうですか?
*str == '\0'
つまり、その行は実際には次のようになります。
*str == (char) 0
これにより、コンパイラはこれを生成します。
fetch the value from where str is stored
now use that value like a memory address and fetch the char that is stored there
check if the value of that fetched char is 0
要約する:
str == NULL
と書くと、ポインタstr
指しているが何もないかどうかがわかります。*str == '\0'
と書くと、ポインタstr
が空の文字列を指しているかどうかがわかります(実際には、ゼロを保持しているメモリ位置を指している)。(「文字列」は、定義上、「最初のヌル文字で終了し、最初のヌル文字を含む文字の連続シーケンス」であるため、文字列の最初の文字が'\0'
の場合、その文字列は空の文字列です。 )
str==NULL
は、ポインタがNULLかどうかを示します。
str[0]=='\0'
は、文字列の長さがゼロかどうかを示します。
そのコードでは、テスト:
if ((str == NULL) || (str[0] == '\0'))
nULLまたは長さがゼロの場合をキャッチするために使用されます。
ここでは短絡が重要な役割を果たすことに注意してください:テストのポイントは、str
が少なくとも1の長さの有効なc文字列であることを確認することです。
str[0] == '\0'
は、str
がNULLでない場合にのみ機能します。str == NULL
は、str
がNULLの場合に早期に発生する必要があります。本質的に
str == NULL
str
がNULL
ポインターであるかどうかを判別しますstr[0] == '\0'
は、str
が長さ0のCスタイル文字列かどうかを判別しますそれらを組み合わせると、NULLか空かを確認します。これにより、関数はメソッドの開始時に両方の形式の空のデータを削除できます
str == NULL
strのチェックはNULLポインタ(どこにもないポインタ)です
str[0] == '\0'
(NULLポインタでない場合)最初のstr要素が0の値を持っているかどうかをチェック(0で終わる文字のみの文字列)
str == NULLは、「strがメモリアドレスゼロを指している」(またはシステム上でNULLのアドレス)ことを意味します。通常、これは文字列がまったくないことを意味します。
str [0] == '\ 0'は、「strの最初の文字は文字0です」(文字列の終わりを示す)を意味します。これは文字列があることを意味しますが、それは空です。空のカップとまったくカップがないと考えてください。同じ考え。
他の言語ではstr == null
vs str == ""
。それらは2つの異なることを意味します。 NULLポインターを使用しようとするとプログラムがクラッシュするため、Cの違いを理解することは特に重要です。
str == NULL
ポインタがNull(文字列のアドレスがnullであることを意味する)であるため、文字列の参照がない文字列を意味します。
str[0] == '\0'
--は長さが0の文字列を意味します。
この説明に何か問題がある場合、またはまだ疑問がある場合はお知らせください。
str == NULL
strがアドレスを指していないことを意味します=ポインタは空です。
およびstr[0] == '\0'
strは有効なアドレスを指しており、この行は最初の文字(つまり、str [0])が文字列の終わりを意味する数字0( '\ 0'のASCII値)であるかどうかをチェックします。その後、文字列は空になります。 (strには文字がありません:最初の文字は終了文字です)
1-> _str == NULL
_は、strがNULLポインターかどうかを決定します2-> _str[0] == '\0'
_は、strが長さ0のcスタイル文字列かどうかを決定します
したがって、このif ((str == NULL) || (str[0] == '\0'))
では、OR演算子の短絡が、文字列が何も指していないか、空の文字列を指していることを確認するためにわかります。
これに相当するC#は次のとおりです。
if (string.IsNullOrEmpty(str))
{
}
単純な意味は、文字列がNULLであるか空の文字列であるかです。