2012-02-14 16 views
8

Próbuję skompilować następujący kod na Ubuntu (64-bit), z Code :: Blocks 10.05 jako IDE:ISO C++ zabrania porównywania wskaźnika i liczby całkowitej [-feprissive] | [C++]

#include <iostream> 
using namespace std; 
int main() { 
    char a[2]; 
    cout << "enter ab "; 
    cin >> a; 
    if (a == 'ab') // line 7 
    { 
     cout << "correct"; 
    } 
    return 0; 
} 

W linii 7, mój kompilator daje mi błąd „ISO C++ zabrania porównywania wskaźnika i liczby całkowitej [-fotencjalnej] ".

Dlaczego to nie działa? Wiem, że mógłbym użyć narzędzia std::string do obejścia problemu, ale chcę zrozumieć obecny problem.

+4

Zauważ, że '' ab'' jest int, podczas gdy '" ab "' jest tablicą znaków. – avakar

Odpowiedz

12

char a[2] definiuje tablicę z char. a to wskaźnik do pamięci na początku tablicy, a użycie == nie spowoduje porównania zawartości a z z 'ab', ponieważ nie są one faktycznie tymi samymi typami, 'ab' jest typem całkowitym. Również 'ab' powinien być "ab" inaczej będziesz mieć tutaj problemy. Aby porównać tablice znaków char, które chcesz użyć, użyj polecenia strcmp.

Coś, co może być ilustracyjne patrzy na typeid z 'ab':

#include <iostream> 
#include <typeinfo> 
using namespace std; 
int main(){ 
    int some_int =5; 
    std::cout << typeid('ab').name() << std::endl; 
    std::cout << typeid(some_int).name() << std::endl; 
    return 0; 
} 

w moim systemie to zwraca:

i 
i 

pokazując, że 'ab' faktycznie oceniano jako int.

Jeśli miałbyś zrobić to samo z std :: string, to masz do czynienia z klasą, a std :: string ma przeciążone operator == i wykona test porównawczy, gdy zostanie wywołany w ten sposób.

Jeśli chcesz porównać dane wejściowe z napisu „AB” w idiomatycznym C++ sposób Proponuję zrobić tak:

#include <iostream> 
#include <string> 
using namespace std; 
int main(){ 
    string a; 
    cout<<"enter ab "; 
    cin>>a; 
    if(a=="ab"){ 
     cout<<"correct"; 
    } 
    return 0; 
} 
+1

Nie do końca poprawne ("a" jest tablicą, jak widać z 'sizeof (a)'), a nie rzeczywistym problemem. –

+0

Myślę, że to powiedziałem, myślę, że formatowanie jest tutaj nieco mylące. – shuttle87

+0

Edytowane, mam nadzieję, że robi rzeczy wyraźniejsze. – shuttle87

5

Ten jest spowodowane:

if(a=='ab'), tutaj , a jest const char* typu (tj szereg znaków)

'ab' jest wartością stałą, które nie są oceniane jako ciąg (gdyż przez pojedynczy), ale będzie oceniana jako liczba całkowita.

Od char jest typem pierwotnym odziedziczonym po C, nie zdefiniowano operatora ==.

dobry kod powinien być:

if(strcmp(a,"ab")==0) Pokochasz więc porównać do innego const char*const char* użyciu strcmp.

+5

Jeśli nie ma niezdefiniowanego zachowania, 'strcmp (a," ab ")' nie może zwrócić '0'. 'a' ma typ' char [2] ', więc najdłuższy łańcuch stylu C, jaki może zawierać, to 1 znak. Coś więcej, a ty masz niezdefiniowane zachowanie. –

+0

istotnie, powinien mieć co najmniej 3 znaki długie, aby mógł zawierać końcowy ciąg znaków NUL. Jednak wyrównanie kompilatora dla przechowywania tej 2 bajtowej tablicy może spowodować 0 wypełnienie sąsiedniej 2-bajtowej pamięci zmiennej, a więc , czyniąc kod "działającym" pomimo błędu programisty. – dweeves

+0

Rozumiem. Dziękuję bardzo. – iyazici

Powiązane problemy