C - Vyhledávání řetězců ve struktuře
- padlo
- Nováček

-
- Registrován: 11. bře 2011
- Bydliště: Perníkov
C - Vyhledávání řetězců ve struktuře
Ahoj, mám problém s vyhledáváním řetězců ve struktuře. Mám pole struktur ve kterým mam načtená data ze souboru a potřebuju vyhledat určitý řetězec v konkrétní položce té struktury. Problém je v tom že v té struktuře je to jako datový typ char, resp pole charů tzn to nejde porovnávat. Nepomůže ani vytvoření struktury s identickým datovým typem uvnitř a následný porovnávání. Díky za radu jak na to 
- arxeiss
- Začátečník

- Registrován: 19. črc 2008
- Bydliště: Krmelín (předměstí Ostravy)
- Kontaktovat uživatele:
Re: C - Vyhledávání řetězců ve struktuře
Máš kapku zkreslené představy 
V C neexistuje datový typ string což ale nic neznamená, ve všech jazycích je string pole charů... Jde pouze o funkce s jakýma pracuješ. Aby ale C poznalo, že je někde konec stringu, tak na konec se dává nulový bajt, což je ve skutečnosti 0, proto, když máš pole charů o 20 prvích, tak do něho uložíš maximálně 19 znaků, protože tam musí být ukončovací nula.
Na porovnání stringů se používá funkce strcmp() která je v string.h
int strcmp (char * str1, char * str2 );
vrací 0 pokud jsou shodné, a pak čísla větší nebo menší když shodné nejsou, ale to přesně nevím jak...
V C neexistuje datový typ string což ale nic neznamená, ve všech jazycích je string pole charů... Jde pouze o funkce s jakýma pracuješ. Aby ale C poznalo, že je někde konec stringu, tak na konec se dává nulový bajt, což je ve skutečnosti 0, proto, když máš pole charů o 20 prvích, tak do něho uložíš maximálně 19 znaků, protože tam musí být ukončovací nula.
Na porovnání stringů se používá funkce strcmp() která je v string.h
int strcmp (char * str1, char * str2 );
vrací 0 pokud jsou shodné, a pak čísla větší nebo menší když shodné nejsou, ale to přesně nevím jak...
PC : CPU: C2D E5200 2500Mhz @ 3750Mhz a AC Freezer 7PRO MB: Gigabyte GA-P31-DS3L rev.2,1 GPU: ATI Radeon 3650HD 256MB RAM: A-Data Vitesta 2x2GB Zdroj: Forton OEM 400W HDD: Samsung F2 500GB
Netbook : Asus EEE CPU: Intel Atom N270 1,6GHz RAM: A-Data 2GB HDD: 250GB 5400ot/min
Netbook : Asus EEE CPU: Intel Atom N270 1,6GHz RAM: A-Data 2GB HDD: 250GB 5400ot/min
- padlo
- Nováček

-
- Registrován: 11. bře 2011
- Bydliště: Perníkov
Re: C - Vyhledávání řetězců ve struktuře
Já vím, že string v C není. Napíšu to názorně, jak to mám a jak mi to nefunguje
Funguje mi tohle, kde se porovnavany promenny ctou z klavesnice.
char znacka1[20];
char znacka2[20];
if (strcmp(znacka1, znacka2) == 0)
printf("Shoda");
else
printf("Neni shoda");
getchar();
// Chtel bych misto jedne promenne vyse nacist kus struktury napr ve tvaru (nacteno[0].znacka) a to porovnat s druhou. Ve strukture je zaznam "znacka" definovan takhle- char znacka[20]; To bude chtít asi nějakou konverzi. Nepomůže mi ani když si vstup z klávesnice načtu do další struktury se stejne definovanym zaznamem a pak zkoušim porovnat jednotlive polozky struktury..
Funguje mi tohle, kde se porovnavany promenny ctou z klavesnice.
char znacka1[20];
char znacka2[20];
if (strcmp(znacka1, znacka2) == 0)
printf("Shoda");
else
printf("Neni shoda");
getchar();
// Chtel bych misto jedne promenne vyse nacist kus struktury napr ve tvaru (nacteno[0].znacka) a to porovnat s druhou. Ve strukture je zaznam "znacka" definovan takhle- char znacka[20]; To bude chtít asi nějakou konverzi. Nepomůže mi ani když si vstup z klávesnice načtu do další struktury se stejne definovanym zaznamem a pak zkoušim porovnat jednotlive polozky struktury..
- arxeiss
- Začátečník

- Registrován: 19. črc 2008
- Bydliště: Krmelín (předměstí Ostravy)
- Kontaktovat uživatele:
Re: C - Vyhledávání řetězců ve struktuře
co by nešlo?
dejme tomu, že struktury máš plné, tak napíšeš
a jěště si zkus vypsat obsah proměnné té struktury, jestli tam je opravdu v tom stringu znacka to co tam má být
dejme tomu, že struktury máš plné, tak napíšeš
Kód: Vybrat vše
char zKlavesnice[200];
gets(zKlavesnice);
if (strcmp(naceteno[0].znacka, zKlavesnice) == 0)
printf("Shoda");
else
printf("Neni shoda");PC : CPU: C2D E5200 2500Mhz @ 3750Mhz a AC Freezer 7PRO MB: Gigabyte GA-P31-DS3L rev.2,1 GPU: ATI Radeon 3650HD 256MB RAM: A-Data Vitesta 2x2GB Zdroj: Forton OEM 400W HDD: Samsung F2 500GB
Netbook : Asus EEE CPU: Intel Atom N270 1,6GHz RAM: A-Data 2GB HDD: 250GB 5400ot/min
Netbook : Asus EEE CPU: Intel Atom N270 1,6GHz RAM: A-Data 2GB HDD: 250GB 5400ot/min
- padlo
- Nováček

-
- Registrován: 11. bře 2011
- Bydliště: Perníkov
Re: C - Vyhledávání řetězců ve struktuře
Obsah struktury i promenny mám pro jistotu vypsaný aby mě to kdyztak trklo, ale stejně to nefunguje. Presne to je takhle:
printf("Zadej znacku kterou chces hledat\n");
scanf("%s", &znacka);
printf("\n");
printf("Nacteno z klavesnice: %s ",znacka);
printf("Nacteno ze struktury %s", nacteno[0].znacka);
if (strcmp(znacka, nacteno[0].znacka) == 0)
printf("Shoda");
else
printf("Neni shoda");
Blbý je, že to vždycky vraci něco jinýho než 0, takže to stále píše že není shoda...
//EDIT: Pridaním nejakych znaku do vypisu z ty struktury před a za jsem zjistil, že mi to automaticky skáče na další řádek po přečtení z tý struktury, tam bude asi chyba
printf("Zadej znacku kterou chces hledat\n");
scanf("%s", &znacka);
printf("\n");
printf("Nacteno z klavesnice: %s ",znacka);
printf("Nacteno ze struktury %s", nacteno[0].znacka);
if (strcmp(znacka, nacteno[0].znacka) == 0)
printf("Shoda");
else
printf("Neni shoda");
Blbý je, že to vždycky vraci něco jinýho než 0, takže to stále píše že není shoda...
//EDIT: Pridaním nejakych znaku do vypisu z ty struktury před a za jsem zjistil, že mi to automaticky skáče na další řádek po přečtení z tý struktury, tam bude asi chyba
- arxeiss
- Začátečník

- Registrován: 19. črc 2008
- Bydliště: Krmelín (předměstí Ostravy)
- Kontaktovat uživatele:
Re: C - Vyhledávání řetězců ve struktuře
hmm, a kde načítáš do té struktury?
PC : CPU: C2D E5200 2500Mhz @ 3750Mhz a AC Freezer 7PRO MB: Gigabyte GA-P31-DS3L rev.2,1 GPU: ATI Radeon 3650HD 256MB RAM: A-Data Vitesta 2x2GB Zdroj: Forton OEM 400W HDD: Samsung F2 500GB
Netbook : Asus EEE CPU: Intel Atom N270 1,6GHz RAM: A-Data 2GB HDD: 250GB 5400ot/min
Netbook : Asus EEE CPU: Intel Atom N270 1,6GHz RAM: A-Data 2GB HDD: 250GB 5400ot/min
- padlo
- Nováček

-
- Registrován: 11. bře 2011
- Bydliště: Perníkov
Re: C - Vyhledávání řetězců ve struktuře
do struktury načítám fgets(nacteno[0].znacka, 20, fread); ze souboru, kde mám v řádkách pod sebou jednotlivé položky
- arxeiss
- Začátečník

- Registrován: 19. črc 2008
- Bydliště: Krmelín (předměstí Ostravy)
- Kontaktovat uživatele:
Re: C - Vyhledávání řetězců ve struktuře
Jo, a pokud nemáš v tom souboru ten string přesně 20 znaků, tak ti čte i další řádky, a taky myslím, že vzhledem k tomu, že načítáš 20 tak tam nemáš tu zakončovací nulu, ale tím si nejsem jist...
A jsi si teda jist, že ty stringy se shodují? Když je vypíšeš? podle mě totiž ne. Kdyžtak hoď celý zdroják někde na net, a já to zkusím
A jsi si teda jist, že ty stringy se shodují? Když je vypíšeš? podle mě totiž ne. Kdyžtak hoď celý zdroják někde na net, a já to zkusím
PC : CPU: C2D E5200 2500Mhz @ 3750Mhz a AC Freezer 7PRO MB: Gigabyte GA-P31-DS3L rev.2,1 GPU: ATI Radeon 3650HD 256MB RAM: A-Data Vitesta 2x2GB Zdroj: Forton OEM 400W HDD: Samsung F2 500GB
Netbook : Asus EEE CPU: Intel Atom N270 1,6GHz RAM: A-Data 2GB HDD: 250GB 5400ot/min
Netbook : Asus EEE CPU: Intel Atom N270 1,6GHz RAM: A-Data 2GB HDD: 250GB 5400ot/min
- padlo
- Nováček

-
- Registrován: 11. bře 2011
- Bydliště: Perníkov
Re: C - Vyhledávání řetězců ve struktuře
Ahoj, omlouvám se že to píšu až teď, nebyl jsem od pátku u správného PC. Zdroják je tady http://pastebin.com/efyABpDc. Databáze je v textaku ve tvaru
Moc děkuju za pomoc 
Kód: Vybrat vše
Skoda
Fabia
2009
1.4
80000
klima, ABS, ESP
180000
Mazda
626
1998
1.8
250000
el. okna
50000
- arxeiss
- Začátečník

- Registrován: 19. črc 2008
- Bydliště: Krmelín (předměstí Ostravy)
- Kontaktovat uživatele:
Re: C - Vyhledávání řetězců ve struktuře
V klidu, ale k programu.
1) Proč máš v komentáři to strcpy?
2) Pokud víš jistě, že mezera je vždy 1 bajt např (\n) tak tam dej fseek a nebo tu mezeru načítej do pomocného stringu, ať nemáš zbytečně v každé struktuře navíc něco...
3) proč načítáš do jedné struktury a jenom kvůli přetypování vytváříš další?
4) Proč tam máš asi 4x getchar()? je tam úplně zbytečně.
1) Proč máš v komentáři to strcpy?
2) Pokud víš jistě, že mezera je vždy 1 bajt např (\n) tak tam dej fseek a nebo tu mezeru načítej do pomocného stringu, ať nemáš zbytečně v každé struktuře navíc něco...
3) proč načítáš do jedné struktury a jenom kvůli přetypování vytváříš další?
4) Proč tam máš asi 4x getchar()? je tam úplně zbytečně.
PC : CPU: C2D E5200 2500Mhz @ 3750Mhz a AC Freezer 7PRO MB: Gigabyte GA-P31-DS3L rev.2,1 GPU: ATI Radeon 3650HD 256MB RAM: A-Data Vitesta 2x2GB Zdroj: Forton OEM 400W HDD: Samsung F2 500GB
Netbook : Asus EEE CPU: Intel Atom N270 1,6GHz RAM: A-Data 2GB HDD: 250GB 5400ot/min
Netbook : Asus EEE CPU: Intel Atom N270 1,6GHz RAM: A-Data 2GB HDD: 250GB 5400ot/min
- padlo
- Nováček

-
- Registrován: 11. bře 2011
- Bydliště: Perníkov
Re: C - Vyhledávání řetězců ve struktuře
ad 1 strcpy mám v komentáři kvůli tomu, že mi to tam přidalo vždycky nějakej shluk znaků, proto bych radši část vyhledával v tý originální struktuře načtený ze souboru
ad 2 vyzkouším
ad 3 zkoušel jsem to ukládat různě, ale tohle bylo jediný co mi fungovalo. Programovat moc neumím a hlavní je pro mě aby to fungovalo jako celek
ad 4 při spuštění programu se to tam vždycky zasekne, takže můžu koukat co který kroky dělaj. Vím že na to je v IDE nějaká funkce, ale až bude program hotovej, tak ty getchary stejně smažu..
ad 2 vyzkouším
ad 3 zkoušel jsem to ukládat různě, ale tohle bylo jediný co mi fungovalo. Programovat moc neumím a hlavní je pro mě aby to fungovalo jako celek
ad 4 při spuštění programu se to tam vždycky zasekne, takže můžu koukat co který kroky dělaj. Vím že na to je v IDE nějaká funkce, ale až bude program hotovej, tak ty getchary stejně smažu..