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ź.
|
|
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 strcmp. |
|
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 ==. |
|
szyx_yankez |
» 2011-06-07 20:04:52
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.
|
|
Mrowqa |
» 2011-06-07 20:12:59 Przypisanie działa, bo jego wartością ( rezultatem ) przypisania jest to co się przypisuje, czyli: A jak wiemy 3 != 0, czyli prawda :) Tam masz adres, więc są jakieś tam liczby :P Pozdrawiam, Mrowqa |
|
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? |
|
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ć == ) string abc = "abc"; if( abc == "abc" )
Klasa string ma przeładowany ( przeciążony ) operator == :D Pozdrawiam, Mrowqa |
|
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. |
|
« 1 » |