Portál AbcLinuxu, 11. května 2025 09:59

Dotaz: porovnanie pola typu char

26.2.2006 19:46 pyty
porovnanie pola typu char
Přečteno: 156×
Odpovědět | Admin
zdravim. rad by som vedel, ako sa vyriesi nasledujuca situacia:
char retazec[3];
cin << retazec[];
cout << retazec[] << endl;
if (retazec == "ahoj")
{
    cout << "true";
}
else
{
    cout << "false";
}
ked napisem ahoj, vrati mi to "ahoj" a "false". skusal som to upravit napr if (retazec == "ahoj\n") (Perl by to myslim zozral keby tam bolo eq :) apod. Ale nic som nevyriesil. Chapem ze to je ulozene v poli, takze by sa to mohlo dat vyriesit nejakym porovnanim z polom. Neide mi to ani ked si tu premennu nadefinujem v kode (teda bez cin). A co ma trapi najviac, kvoli comu som to vlastne robil je, mi to neporovna parameter predavany funkcii main z prikazoveho riadku. teda ked som to spravne pochopil, argv je vnorene pole a k tomu este ako ukzaovatel? ako to teda vyriesit? ukazovatele mi zatial akosi neidu a mam v tom truchu zmatok. pls pomozte niekto....
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Luboš Doležel (Doli) avatar 26.2.2006 19:55 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: porovnanie pola typu char
Odpovědět | | Sbalit | Link | Blokovat | Admin
  1. Proč tam dáváte retazec[]?
  2. Na porovnání používejte strcmp(3)
Luboš Doležel (Doli) avatar 26.2.2006 19:57 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: porovnanie pola typu char
3. Hrůza - retazec je pole jen na 2 znaky. Výsledkem je buffer overrun.
26.2.2006 20:22 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: porovnanie pola typu char
Ad 2: když už se používá standardní C++ knihovna, tak proč jen napůl? Správné je použít typ std::string a pak je namístě i operátor ==.
Josef Kufner avatar 27.2.2006 13:27 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: porovnanie pola typu char
Tojo, ale je pak mensi sance, ze mu dojde, ze porovnava pointery a ne data...
Hello world ! Segmentation fault (core dumped)
26.2.2006 19:59 Boris
Rozbalit Rozbalit vše Re: porovnanie pola typu char
Odpovědět | | Sbalit | Link | Blokovat | Admin
chyba je zde: retazec == "ahoj"
porovnáváte totiž ne řetězce, ale proměnné typu char[], což je pointer na začátek řetězce. Je nutné použít buď fci strcmp deklarovanou v string.h: if (! strcmp (retazec, "ahoj")), nebo (vzhledem k tomu, že to je C++ kód) je daleko čistějším řešením typ std::string místo char[], kde to jde dělat intuitivně tak, jak jste napsal (tedy std::string retazec
...
if (retazec == "ahoj")
. Je myslím v #include <string>
27.2.2006 12:18 pyty
Rozbalit Rozbalit vše Re: porovnanie pola typu char
Odpovědět | | Sbalit | Link | Blokovat | Admin
ono to funguje, ale stale to nevyriesilo moj problem:
#include <iostream>

using namespace std;

int main(int argc, char **argv)
{
 if (!strcmp(argv[2],"ahoj"))
   {
     cout << "true\n";
   }
 else
   {
     cout << "false\n";
   }
}
bud mi to vrati false ked tam nedam nic, alebo segmention fault ked dam ako parameter ahoj alebo hocico ine... skusal som to aj ako
int main(int argc, char *argv[])
aky je medzi tym vlastne rozdiel ?
27.2.2006 12:37 mike
Rozbalit Rozbalit vše Re: porovnanie pola typu char
co takhle argv[1] pro prvni pozicni parametr (nulty je jmeno binarky)
27.2.2006 12:49 #Tom
Rozbalit Rozbalit vše Re: porovnanie pola typu char
Odpovědět | | Sbalit | Link | Blokovat | Admin
Sice něco z níže uvedeného tu už někteří napsali, ale je dobré si shrnout všechny chyby:
27.2.2006 18:15 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: porovnanie pola typu char
S tím posledním bodem bych si dovolil nesouhlasit, nebo aspoň ne tak obecně, jak jste to napsal. V tomto konkrétním případě je to celkem jedno, ale když to budete používat všude, výsledkem budou občas zoufale neefektivní aplikace. Viz C++ FAQ.
27.2.2006 14:23 podlesh | skóre: 38 | Freiburg im Breisgau
Rozbalit Rozbalit vše Re: porovnanie pola typu char
Odpovědět | | Sbalit | Link | Blokovat | Admin
Bohužel, mám špatnou zprávu.

Výrok "ukazovatele mi zatial akosi neidu" je ekvivalentní výroku "o C netuším vůbec nic."

Jak se kdysi jeden člověk (paskma) vyjádřil, C je přenositelný asembler. Programování v C/asembleru vyžaduje znalost práce mikroprocesoru a jasnou představu o tom, co je uloženo v paměti a jak. Pro CPU neexistují žádné řetězce, existují jen byty v paměti a adresy těchto bytů.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.