-4

C では、文字配列があります。

d[20] 

null 終了文字を使用して値「if」が割り当てられます。

d[0]='i'
d[1]='f'
d[2]='\0'

の値はstrcmp(d,"if")0 であるべきですか? なんで?

strcmp値 0 を返すことを期待しています。実行すると、-1 の値が返されます。

4

6 に答える 6

6

つまりd[0] = 'i'; d[1] = 'f'; d[2] = '\0';、はい、それは 0 を返す必要 d[2] = '/0'があります。 はまったく異なるものを割り当て、文字列は null で終了しません。少なくともあなたが期待している場所ではありません - strcmp はおそらく雑草の中に入り込み、泥を吸い始めます。

于 2010-04-19T17:02:25.287 に答える
2

@everyone:'/ 0'タイプミスは、@Markが元の質問を編集したときに導入されました。オリジナルには適切な「\0」がありました。あなたの答え(そしてOPについての仮定)のほとんどは誤った方向に向けられています。

@mekasperasky次のコードは、の値を正しく生成します0。あなたがそれをあなたの個人的なコードと比較して違いを見つけることができれば、あなたはあなた自身の問題を解決したかもしれません。

int main(int argc, char* argv[])
{
   char d[20] = {0};
   d[0] = 'i';
   d[1] = 'f';
   d[2] = '\0';

   int value = strcmp(d,"if");
   cout << value << endl;
   return 0;
}
于 2010-04-19T17:55:20.690 に答える
1

他の回答が述べているように、'/0'はヌル終了文字ではありません'\0'

文字リテラルに複数の文字を指定すると、エラーが発生する可能性があります。残念ながら(少なくともこの場合)Cは「複数文字」リテラル文字を許可しますが、複数文字リテラルの正確な動作は実装で定義されています(6.4.4.4 / 2「文字定数」)。

整数文字定数の型はintです。シングルバイト実行文字にマップされる単一文字を含む整数文字定数の値は、整数として解釈されるマップされた文字の表現の数値です。複数の文字(たとえば、'ab')を含む、または1バイトの実行文字にマップされない文字またはエスケープシーケンスを含む整数文字定数の値は、実装によって定義されます。

したがって、'/0'「文字」は、に格納されたときに切り捨てられる実装定義のint値になりd[2]ます。コンパイラは「複数文字」リテラルに対して警告を生成する場合がありますが、それはおそらくコンパイラに与える正確なオプションにも依存します。

たとえば、GCCから次の警告が表示されます(たまたま-Wallが設定されています)。

C:\temp\test.cpp:6:14: warning: multi-character character constant

MSVCとMinGWを使用したテストでは、の値'/0'0x00002f30であるため、最終的にはd[2] = '/0'と同等になりd[2] = '0'ます。

于 2010-04-19T17:15:38.637 に答える
1

これは私が持っているすべてのCコンパイラで動作します。私は違った期待をしていませんでした。Codepadでも動作します。

これはCコンパイラで機能しますか?

#include <stdio.h>
#include <string.h>

char d[20];

int main(void) {
   d[0]='i';
   d[1]='f';
   d[2]='\0';

   printf("Value of strcmp=%i\n\n",strcmp(d,"if"));  /* will print 0 */

   return 0;
}
于 2010-04-19T17:58:56.353 に答える
1

d[2]あるべきで'\0'はありません'/0'

于 2010-04-19T17:01:43.533 に答える
1

null 値は次のように示されます。

d[2]='\0'

あなたが書いたように /0 ではありません。

于 2010-04-19T17:03:03.373 に答える