1

C の 2 つの文字列を比較して等しいかどうかを確認するのに問題があります。

switch(i) {
case 1:
  printf("Got in case 1.  TextA=%s    word=%s \n",TextA,word);
  if(TextA == word) {       
    SubTypeOption = 1;
    printf("SubTypeOptioon = %d",SubTypeOption);
  }

私の出力では、「Got in case 1.TextA=SupTypeA word=SupTypeA SubTypeOption = 0」を取得します//だから、どういうわけか変更されませんでした

4

6 に答える 6

6

演算子はポインタ==を比較します。2つがメモリ内の同じアドレスを指している場合にのみ成功します。Cで文字列のコンテンツを比較するには、またはの呼び出しが必要です。char*strcmpstrncmp

if (strcmp(TextA, word) == 0) {
    // Strings are identical
}

strcmpゼロとの比較に注意してください。関数は文字列を辞書式に比較し、文字列が等しい場合はゼロを返すため、これが必要です。<strings.h>を使用するには、を含める必要がありますstrcmp

于 2013-02-08T18:36:44.827 に答える
5

使用するstrcmp

'=='演算子ではありません

http://www.cplusplus.com/reference/cstring/strcmp/

于 2013-02-08T18:36:37.337 に答える
2

==同じメモリ位置に配置されているかどうかを比較しているため、記号を使用して文字列を比較することはできません。TextAおよびwordは、各c文字列の最初の文字へのポインタです。

文字列を比較するために使用されるstrcmp()または関数。strlcmp()2つの文字列が等しい場合は0を返します

#define STREQ(a,b) (strcmp((a),(b))==0)
if (STREQ(TextA, word)){

}
于 2013-02-08T18:36:54.513 に答える
1

シンプル-strcmpを使用-それはあなたが必要とする機能です。

于 2013-02-08T18:37:24.217 に答える
1

文字列 (またはその他の配列型) の内容を 、 、 などの標準関係演算子と比較することはできません==<代わりにライブラリ関数>を使用する必要があります。strcmp

#include <string.h>
...
if (strcmp(TextA, word) == 0)
{
  // strings are equal
}

strcmpTextAは、辞書式に より小さい場合は< 0 word、辞書式に等しい場合は 0、TextA辞書式に より大きい場合は> 0の整数値を返しますword

C ロケールでは、これは文字列が「ASCIIbetically」に並べられることを意味することに注意してください。つまり、 で始まる文字列は、 で始まる'a'文字列の後に続きます。これは'Z'、 の ASCII コード'a'が より大きいため'Z'です。

では、なぜ==文字列の比較に使用できないのでしょうか?

sizeof_Alignof、または単項演算子のオペランドである場合、または宣言で配列を初期化するために使用される文字列リテラルである場合を除き、&型 "N 要素配列T" の式は型 "pointer の式に変換されます。Tその値は、配列の最初の要素のアドレスになります 。

これは、 conditionTextA == wordで、式TextAとの両方wordがポインター値に変換されていることを意味します。2 つの配列の内容を比較する代わりに、それらのアドレスを比較しています。

于 2013-02-08T19:17:39.200 に答える
0
switch(i) {
case 1:
  printf("Got in case 1.  TextA=%s    word=%s \n",TextA,word);
  if(strcmp(TextA,word)==0) {       //something like that
    SubTypeOption = 1;
    printf("SubTypeOptioon = %d",SubTypeOption);
  }

http://www.cplusplus.com/reference/cstring/strcmp/

于 2013-02-08T18:37:45.153 に答える