web-dev-qa-db-ja.com

Cのstr == NULLとstr [0] == '\ 0'の違いは何ですか?

str == NULLstr[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を使用しています。

52
john

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'の場合、その文字列は空の文字列です。 )

46
Shalom Craimer

str==NULLは、ポインタがNULLかどうかを示します。

str[0]=='\0'は、文字列の長さがゼロかどうかを示します。

そのコードでは、テスト:

if ((str == NULL) || (str[0] == '\0'))

nULLまたは長さがゼロの場合をキャッチするために使用されます。


ここでは短絡が重要な役割を果たすことに注意してください:テストのポイントは、strが少なくとも1の長さの有効なc文字列であることを確認することです。

  • 2番目のテストstr[0] == '\0'は、strがNULLでない場合にのみ機能します。
  • したがって、最初のテストstr == NULLは、strがNULLの場合に早期に発生する必要があります。
109
Mysticial

本質的に

  • str == NULLstrNULLポインターであるかどうかを判別します
  • str[0] == '\0'は、strが長さ0のCスタイル文字列かどうかを判別します

それらを組み合わせると、NULLか空かを確認します。これにより、関数はメソッドの開始時に両方の形式の空のデータを削除できます

27
JaredPar

str == NULL strのチェックはNULLポインタ(どこにもないポインタ)です

str[0] == '\0'(NULLポインタでない場合)最初のstr要素が0の値を持っているかどうかをチェック(0で終わる文字のみの文字列)

8
triclosan

str == NULLは、「strがメモリアドレスゼロを指している」(またはシステム上でNULLのアドレス)ことを意味します。通常、これは文字列がまったくないことを意味します。

str [0] == '\ 0'は、「strの最初の文字は文字0です」(文字列の終わりを示す)を意味します。これは文字列があることを意味しますが、それは空です。空のカップとまったくカップがないと考えてください。同じ考え。

他の言語ではstr == null vs str == ""。それらは2つの異なることを意味します。 NULLポインターを使用しようとするとプログラムがクラッシュするため、Cの違いを理解することは特に重要です。

6
Rena

str == NULLポインタがNull(文字列のアドレスがnullであることを意味する)であるため、文字列の参照がない文字列を意味します。

str[0] == '\0'--は長さが0の文字列を意味します。

この説明に何か問題がある場合、またはまだ疑問がある場合はお知らせください。

4
Sandy
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演算子の短絡が、文字列が何も指していないか、空の文字列を指していることを確認するためにわかります。

2
Anshul garg

これに相当するC#は次のとおりです。

if (string.IsNullOrEmpty(str))
{

}

単純な意味は、文字列がNULLであるか空の文字列であるかです。

0
Estefany Velez