2016-05-27 10 views
-1

Ich habe eine Funktion geschrieben, um zu überprüfen, ob zwei Strings gleich sind oder nicht.Pointer Integer Character Warnung in 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++; 
    } 
} 

Es funktioniert ordnungsgemäß. Aber der GCC-Compiler gibt einige Warnungen, die ich nicht bekommen habe.

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") { 
               ^

Auch beim Scannen und Speichern einer Zeichenfolge,

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

Ich bin immer noch ein Fehler, die ich nicht bekommen.

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); 
     ^

Kann jemand erklären, was diese Fehler sind?

Antwort

1

Zuerst string1[i] ist vom Typ char und Sie vergleichen das mit einem String, "\0". Was Sie brauchen, ist

string1[i] == '\0' 

und ebenfalls.

Zweitens ist es am wahrscheinlichsten, dass operation ein Array ist. Sie können den Array-Namen als Argument %s mit scanf() übergeben, es wird automatisch zum Zeiger auf das erste Element des Arrays verfallen.

+0

Sie meinen, ich sollte scanf schreiben ("% s", & Operation [0]); ? – rohit15079

1

Sie müssen Zeichenliterale statt Stringliterale

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

Stringliterale wie zum Beispiel „\ 0“ haben Arten von Zeichen-Arrays. Das String-Literal "\ 0" hat den Typ char[2] und besteht aus zwei Zeichen {'\ 0', '\ 0'}. In Ausdrücken mit seltenen Ausnahmen werden sie in Zeiger auf ihre ersten Zeichen konvertiert und haben den Typ char *.

Berücksichtigen Sie, dass die Funktionsparameter im Allgemeinen den Qualifier const haben sollten.

Außerdem gibt es redundante Bedingungen innerhalb der Funktion.

Die Funktion kann einfacher geschrieben werden. Zum Beispiel

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]; 
} 

Anstelle des Typs int für den Index ist es besser, Typen verwenden size_t oder ptrdiff_t.

Zum Beispiel

size_t i = 0; 
+0

ich denke, es sollte while sein (string1 [i] == string2 [i] || (string1 [i]! = '\ 0' && string2 [i] = '\ 0')) i ++; Bitte korrigieren Sie mich, wenn ich falsch liege. – rohit15079

+0

@ rohit15079 Sie liegen falsch. –

+0

Ok Entschuldigung, ich habe es verstanden. – rohit15079

1

In C, ein doppeltes Anführungszeichen ist eine Zeichenkette (eine Anordnung von char), während eine einzelne Zeichenfolge in Anführungszeichen ein einzelne Zeichen ist (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 warnt Sie, weil, obwohl Sie diese Vergleiche (zwischen verschiedenen Typen) tun können, wenn Sie wirklich wollen, ist es fast sicher nicht, was Sie vorhatten zu tun.