Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Niby banalny problem

Ostatnio zmodyfikowano 2011-06-07 21:30
Autor Wiadomość
czarek1959
Temat założony przez niniejszego użytkownika
Niby banalny problem
» 2011-06-07 19:45:33
Witam,
Po pewnym czasie "kodzenia" w C++, natknąłem się na niby banalny problem. Zdawało mi się, że jestem już znacznie dalej a tu wracam prawie do początków - może mnie "przymuliło".
Mam taki programik w 2 plikach:
// pierwszy
#include <iostream>

using namespace std;

void test(char *wyraz)
{
    if (wyraz == "abc")       // (1)
        cout << "OK" << endl;
    else
        cout << "NOK" << endl;
}

// drugi - główny
#include <iostream>

using namespace std;

void test(char *);

int main()
{
    char *nazwa;

    nazwa = "abc";
    test(nazwa);

    return 0;
}
Problem polega na tym, że jeśli w (1) jest tak jak jest to wynik jest zawsze NOK , a powiniem być OK !.
Jeśli w (1) zrobię if (wyraz = "abc") to wtedy jest OK. I tu się rodzi drugie pytanie, dlaczego kompilator (CodeBlocks) pozwala na postawienie znaku = w instrukcji warunkowej.
Uprzejma prośba o podpowiedź.
P-33945
michalp
» 2011-06-07 19:52:13
Używasz nie tyle string co wskaźnik na char. Wskaźnik ten wskazuje na jeden (pierwszy) znak w łańcuchu. Żeby porównać go z innym łańcuchem znaków musisz porównać po kolei każdy z tych znaków ze sobą. Do tego służy funkcja » standard Cstrcmp.
P-33946
czarek1959
Temat założony przez niniejszego użytkownika
» 2011-06-07 20:04:27
Celowo użyłem wskaźnika, bo przy stringu wszystko jest ok. Nawet jeśli użyję funkcji strcmp, to nie wyjaśnia to sprawy dlaczego znak = działa? Dodatkowo jeśli wszystko umieszczę w jednym pliku to wszystko działa jak trzeba bez strcmp i ze znakiem ==.
P-33947
szyx_yankez
» 2011-06-07 20:04:52
kompilator (CodeBlocks)
To nie kompilator to środowisko programistyczne(IDE). Kompilator jaki jest standardowo dołączany do Code::Blocks 10.05 to MinGw 4.4.
dlaczego kompilator (CodeBlocks) pozwala na postawienie znaku = w instrukcji warunkowej.
Pozwala bo standard c++ na to zezwala.
Do instrukcji warunkowej if(oraz pętli) możesz wstawić niemalże każdą "zwykłą" instrukcje.
P-33948
Mrowqa
» 2011-06-07 20:12:59
Przypisanie działa, bo jego wartością ( rezultatem ) przypisania jest to co się przypisuje, czyli:
C/C++
if( a = 3 ) // rownoznaczne z if( 3 )
A jak wiemy 3 != 0, czyli prawda :)
Tam masz adres, więc są jakieś tam liczby :P

Pozdrawiam,
Mrowqa
P-33949
czarek1959
Temat założony przez niniejszego użytkownika
» 2011-06-07 20:33:27
Z tym kompilatorem CodeBlocks to taki skrót myślowy, ale będąc precyzyjnym to racja!
Wszystko zrozumiałem, dzięki za wyjaśnienia.
Czy rzeczywiście jedynym skutecznym sposobem porównania C-stringów (typu char) jest użycie funkcji strcmp, czyli porównywanie znak po znaku?
P-33950
Mrowqa
» 2011-06-07 21:11:36
Możesz sam porównywać znak po znaku :)
Ciekawy sposób i wygodny zarazem to użycie stringów ( wolno użyć == )
C/C++
string abc = "abc";
if( abc == "abc" ) // wolno !!
Klasa string ma przeładowany ( przeciążony ) operator == :D

Pozdrawiam,
Mrowqa
P-33951
czarek1959
Temat założony przez niniejszego użytkownika
» 2011-06-07 21:30:02
Wszystko jasne. Dziękuję za odpowiedzi i pomoc.
Pozdrawiam i zamykam temat.
P-33952
« 1 »
  Strona 1 z 1