2016-05-27 8 views
-1

2つの文字列が同じかどうかを調べる関数を書いています。Cでのポインタ整数文字警告

int sameString (char string1[], char string2[]) { 
    int i = 0; 
    while (string1[i] == string2[i]) { 
     if (string1[i] == "\0" || string2[i] == "\0") { 
      if (string1[i] == "\0" && string2[i] == "\0") { 
       return TRUE; 
      } 
      else { 
       return FALSE; 
      } 
     } 
     i++; 
    } 
} 

正常に動作しています。しかし、gccコンパイラは私が得られなかったいくつかの警告を出しています。

2.c: In function ‘sameString’: 
2.c:10:24: warning: comparison between pointer and integer [enabled by default] 
     if (string1[i] == "\0" || string2[i] == "\0") { 
         ^
2.c:10:46: warning: comparison between pointer and integer [enabled by default] 
     if (string1[i] == "\0" || string2[i] == "\0") { 
              ^
2.c:11:28: warning: comparison between pointer and integer [enabled by default] 
      if (string1[i] == "\0" && string2[i] == "\0") { 
          ^
2.c:11:50: warning: comparison between pointer and integer [enabled by default] 
      if (string1[i] == "\0" && string2[i] == "\0") { 
               ^

はまた

char operation[8]; 
scanf ("%s", &operation); 

、スキャンし、文字列を保存しながら、私は取得していない1つの以上のエラーを取得しています。

2.c: In function ‘main’: 
2.c:65:9: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[8]’ [-Wformat=] 
     scanf ("%s", &operation); 
     ^

これらのエラーは何か説明できますか?

答えて

1

まず、string1[i]はタイプcharのものであり、あなたは文字列"\0"であることを比較しています。必要なのは、

string1[i] == '\0' 

などです。

第2に、operationは配列である可能性が最も高いです。配列名はscanf()%sの引数として渡すことができ、配列の最初の要素へのポインタに自動的に減衰します。

+0

あなたはscanf( "%s"、&operation [0])と書くべきです。 ? – rohit15079

1

あなたは文字リテラルの代わりに文字列リテラル

if (string1[i] == '\0' || string2[i] == '\0') { 
        ^^^^     ^^^^ 
     if (string1[i] == '\0' && string2[i] == '\0') { 
          ^^^^     ^^^^ 
      return TRUE; 
     } 

例えばとして文字列リテラルを使用する必要があります「\ 0」は、文字配列のタイプがあります。文字列リテラル "\ 0"は、タイプがchar[2]で、2つの文字{'\ 0'、 '\ 0'}で構成されています。 まれな例外を含む式では、最初の文字へのポインタに変換され、タイプはchar *です。

一般的に関数パラメータには修飾子constが含まれている必要があることを考慮してください。

また、関数内に冗長な条件があります。

この関数は簡単に書くことができます。例えば

int sameString (const char string1[], const char string2[]) 
{ 
    int i = 0; 

    while (string1[i] == string2[i] && string1[i] != '\0') i++; 

    return string1[i] == string2[i]; 
} 

の代わりに、タイプsize_tまたはptrdiff_tを使用することをお勧めしインデックスのタイプint。 C、二重引用符で囲まれた文字列で

例えば

size_t i = 0; 
+0

私はそれがwhile(string1 [i] == string2 [i] ||(string1 [i]!= '\ 0' && string2 [i] = '\ 0'))i ++;私が間違っていれば私を修正してください。 – rohit15079

+0

@ rohit15079あなたは間違っています。 –

+0

申し訳ありませんが、私はそれを持っています。 – rohit15079

1

単一引用符で囲まれた文字列は、単一の文字(char)であるが、文字列(charの配列)である。

#include "stdio.h" 

int main (int argc, char **argv) { 
    char* s= "foo"; 

    // this is comparing the character at s[0] to the location 
    // (pointer) of where the string "f" is stored. 
    if (s[0] == "f") { 
    printf("s[0] is the same as the location of the string f\n"); 
    } 

    // This is comparing the character at s[0] to the character 'f' 
    // which is what you're asking to do. 
    if (s[0] == 'f') { 
    printf("s[0] is the same as the character f\n"); 
    } 
} 

gccはあなたに警告しています。あなたが本当に欲しいのであれば、これらの比較を(さまざまなタイプ間で)行うことはできますが、あなたがすることはほとんどありません。

関連する問題