.[ ČeskéHry.cz ].
Vytahnuti cisel ze stringu

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Aroidzap



Založen: 14. 11. 2011
Příspěvky: 68

PříspěvekZaslal: 9. květen 2012, 20:53:46    Předmět: Vytahnuti cisel ze stringu Odpovědět s citátem

Je nejaky zpusob jak vytahnout ze stringu napr. "125 125 672 60 60 673 38" pomoci std::stringstream cisla? Ne po jednom jako tady :
kód:
std::stringstream string = "125 125 672 60 60 673 38";
int x[7];
string>>x[0]>>x[1]>>x[2]>>x[3]... ;

Ale nejak pro n cisel napr.
kód:
std::stringstream string = "125 125 672 60 60 673 38...";
int *x = new int[n];
string>>x;
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
OndraSej



Založen: 28. 07. 2007
Příspěvky: 767
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 9. květen 2012, 21:07:37    Předmět: Odpovědět s citátem

Ano, v cyklu to z nej po jednom vytahas Wink
_________________
http://trionteam.net
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Aroidzap



Založen: 14. 11. 2011
Příspěvky: 68

PříspěvekZaslal: 9. květen 2012, 21:08:47    Předmět: Odpovědět s citátem

no a ten string musim asi nejak roztrhat ze?

protoze kdyz udelam tohle :
kód:
for (int i=0;i<100;i++)
{
    string>>x[i];
}

tak mi to vzdycky vytahne jen prvni cislo
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Aroidzap



Založen: 14. 11. 2011
Příspěvky: 68

PříspěvekZaslal: 9. květen 2012, 21:13:27    Předmět: Odpovědět s citátem

a jeste jedna otazka...

kdyz ten string mam jako char*, ma cenu to prevadet na std::stringstream, nebo mam pro vytahnuti pouzit sscanf_s ?

(sscanf_s jsem totiz az do ted pouzival i v c++)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
OndraSej



Založen: 28. 07. 2007
Příspěvky: 767
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 9. květen 2012, 22:43:23    Předmět: Odpovědět s citátem

Tady to funguje, asi neco delas spatne Wink

kód:
std::stringstream stream("1 2 3 4 5");
while (stream) {
  int c = 0;
  if (stream >> c) {
    std::cout << c << std::endl;
  }
}


sscanf_s pouzit muzes, ale pro nej ten retezec budes muset rozsekat, protoze ti vrati jenom pocet prectenych poli, ale ne pozici v retezci. Jinak pokud chces nejake lepsi parsovani, tak doporucuju pouzit spis nejakou knihovnu, treba http://code.google.com/p/re2/, resp. http://code.google.com/p/re2win/.
_________________
http://trionteam.net
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Aroidzap



Založen: 14. 11. 2011
Příspěvky: 68

PříspěvekZaslal: 10. květen 2012, 15:04:25    Předmět: Odpovědět s citátem

neslo mi to asi protoze jsem to pri kazdym kroku konvertoval
kód:
char *string = "1 5 2 32 54 ...";
int x[100];
for (int i=0;i<100;i++)
{
    (std::stringstream)string>>x[i];
}

Kdyz ja nevim... porad se rozhoduju jestli pouzivat stdio nebo iostream.. nekde jsem cetl ze to neni dobry pouzivat zaroven, ze je lepsi pouzivat jen jedno, nekde ze je lepsi stdio, nekde ze iostream...

me jde hlavne o rychlost a at to zbytecne nezaplacava ramku
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
OndraSej



Založen: 28. 07. 2007
Příspěvky: 767
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 10. květen 2012, 15:37:50    Předmět: Odpovědět s citátem

Jo, ta konverze v kazdem kroku byla spatne, tim se ti pozice v tom streamu vzdy resetovala na zacatek retezce (resp. vytvoril se novy stream, takze to zacinalo na zacatku retezce).

Pokud jde o kombinovani, tak to muze byt problem u vstupu a u vystupu ze stdin, stdout a stderr, ale pokud budes cist jen z retezce, je to asi jedno. Co pouzijes nakonec je asi jedno - ty streamy jsou lepsi pokud potrebujes z retezce cist postupne vetsi mnozstvi dat a pouzivat pritom nejakou slozitejsi logiku (ale zase nastaveni formatovani je dost opruz). Pokud chces jenom rozebirat retezce, ktere maji pevny format, pak je jednodussi scanf.

Pameti spotrebuji asi tak stejne a ve srovnani se zpracovavanym retezcem to bude dost male cislo.
_________________
http://trionteam.net
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Aroidzap



Založen: 14. 11. 2011
Příspěvky: 68

PříspěvekZaslal: 10. květen 2012, 16:14:58    Předmět: Odpovědět s citátem

abych nemusel kopirovat char *string do std::stringstream stream, chtel jsem to udelat takto
kód:
std::stringstream *stream = &(std::stringstream)string;

while(*stream)
{
   *stream>>x;
}

bohuzel mi to haze vyjimku... pointery stale moc neumim.. takze nevim jak to napsat jinak
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
OndraSej



Založen: 28. 07. 2007
Příspěvky: 767
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 10. květen 2012, 16:34:07    Předmět: Odpovědět s citátem

Prostuduj si zdrojaky std::stringstream, jak presne funguje (hint: jinak, nez si myslis).

0. (std::stringstream)string se sice mozna zkompiluje, ale neni to dobry zpusob jak psat kod v C++. Jde o C-like "konverzi", ktera se v C++ nedoporucuje a hlavne v tomhle pripade nejde ani tak o pretypovani, jako spis o vytvoreni noveho objektu.

1. tim, co jsi napsal, se zkopirovani nevyhnes, naopak si tim zadelavas na problemy, protoze (std::stringstream)string bude docasny objekt, ktery vznikne na zasobniku behem "pretypovani" (a hned zase zanikne), ale nekam si na nej ulozis ukazatel. Coz znamena, ze 'stream' ti bude ukazovat na neexistujici objekt, nekde kolem vrcholu zasobniku (takze to bud jenom spadne na praci s nesmyslnymi daty, nebo si prepises neco na zasobniku; v kazdem pripade to je spatne).

2. mozna by se slo vyhnout kopirovani, pokud bys pouzil istringstream nad objektem typu string. Ale nejsem si uplne jisty, jak presne to istringstream interne resi.

3. spravne reseni je to, co jsem psal vyse. Vytvorit std::stringstream na zasobniku mimo smycku a neresit ukazatele.
_________________
http://trionteam.net
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Aroidzap



Založen: 14. 11. 2011
Příspěvky: 68

PříspěvekZaslal: 10. květen 2012, 16:47:04    Předmět: Odpovědět s citátem

no a kdyz se pres tohle nejak prekousu, jak napr. vytahnu string1 a string2 z retezce "string1=\"string2\""

se sscanf bych do formatu napsal tohle : %s=\"%s\" ale ted s iostreamem fakt nevim... dival jsem se ruzne po netu ale nic moc jsem nenasel... nakonec to mozna bude lepsi zustat u C funkci... ale na druhou stranu chci trochu udrzet krok s dobou... C funkce jsou prece jen v urcitych ohledech zastarale

no.. a nebo si udelat vlastni funkci na vytahnuti toho co potrebuju.. ale to asi nebude nejlepsi napad Very Happy
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 10. květen 2012, 18:10:42    Předmět: Odpovědět s citátem

citace:
C funkce jsou prece jen v urcitych ohledech zastarale


Nejsem si uplne jisty, ale nejsou C++ knihovny napsane prave pomoci C funkci ? Smile



Zrovna tady bych se nebal pouzit strtok a pak převod retezce na cislo... v tomhle konkretnim pripade by to melo fungovat dobre. Osobně ty std funkce, co maji neco spolecneho se stringy nesnasim a nepouzivam.

http://www.cplusplus.com/reference/clibrary/cstring/strtok/
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Aroidzap



Založen: 14. 11. 2011
Příspěvky: 68

PříspěvekZaslal: 10. květen 2012, 18:20:46    Předmět: Odpovědět s citátem

... ja bych se asi nejradsi drzel char*, takze nakonec to vidim ze pres std::stringstream budu vytahovat jen cisla a retezec si roztrham... a asi zkusim udelat test co je rychlejsi a kolik ramky to zere (std::stringstream vs sscanf)

a jak to je teda s tim iostream vs stdio... moc nechapu kdy co pouzivat.. jestli ma cenu pouzivat C funkce... cetl jsem ze nejsou moc safe a ze pro C++ se ma pouzivat iostream. Mam uz z toho hlavu akorat tak na prasknuti a nevim jestli mam prepisovat to co jsem vsecko udelal pomoci C funkci, protoze toho jeste neni zas tak moc.. no proste nevim jak dal nechci abych nejakeho rozhodnuti pozdeji litoval
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 10. květen 2012, 18:29:31    Předmět: Odpovědět s citátem

Já osobně bych to nepřepisoval a nechal tam ty C funkce.... Ale ať se raději vyjádří ještě někdo, kdo má větší přehled.

Osobně třeba C funkce používám a pokud to jde, "std" balíku se vyhýbám (s výjimkou std::vector) a používám externí řešení (v případě M$ např. balík ATL, s tím, že jsem si vědom nepřenositelnosti ale nijak mi to nevadí)
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 10. květen 2012, 19:51:45    Předmět: Odpovědět s citátem

Vždy je dobré držet se jednoho standardního balíku a jazyka. Tedy pokud danou aplikaci, knihovnu, ... pokud dělám pod jazykem C, použiju libc (tedy klasické char*), pokud dělám pod C++ můžu se rozhodnout zda dělat pod libc, libc++ (klasické std::string), či použiju něco ještě většího a obecnějšího např. boost (tedy boost::string), či něco specifického bstring.

Pokud však použiju jakoukoliv nestandardní knihovnu (tedy ze zmíněných je to boost a bstring), je vhodné přidat k executable souboru také knihovny, pro knihovny zdůraznit dependencies (příp. je nainstalovat).
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna