Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Aroidzap
Založen: 14. 11. 2011 Příspěvky: 68
|
Zaslal: 9. květen 2012, 20:53:46 Předmět: Vytahnuti cisel ze stringu |
|
|
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 |
|
|
OndraSej
Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 9. květen 2012, 21:07:37 Předmět: |
|
|
Ano, v cyklu to z nej po jednom vytahas _________________ http://trionteam.net |
|
Návrat nahoru |
|
|
Aroidzap
Založen: 14. 11. 2011 Příspěvky: 68
|
Zaslal: 9. květen 2012, 21:08:47 Předmět: |
|
|
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 |
|
|
Aroidzap
Založen: 14. 11. 2011 Příspěvky: 68
|
Zaslal: 9. květen 2012, 21:13:27 Předmět: |
|
|
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 |
|
|
OndraSej
Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 9. květen 2012, 22:43:23 Předmět: |
|
|
Tady to funguje, asi neco delas spatne
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 |
|
|
Aroidzap
Založen: 14. 11. 2011 Příspěvky: 68
|
Zaslal: 10. květen 2012, 15:04:25 Předmět: |
|
|
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 |
|
|
OndraSej
Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 10. květen 2012, 15:37:50 Předmět: |
|
|
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 |
|
|
Aroidzap
Založen: 14. 11. 2011 Příspěvky: 68
|
Zaslal: 10. květen 2012, 16:14:58 Předmět: |
|
|
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 |
|
|
OndraSej
Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 10. květen 2012, 16:34:07 Předmět: |
|
|
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 |
|
|
Aroidzap
Založen: 14. 11. 2011 Příspěvky: 68
|
Zaslal: 10. květen 2012, 16:47:04 Předmět: |
|
|
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 |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 10. květen 2012, 18:10:42 Předmět: |
|
|
citace: |
C funkce jsou prece jen v urcitych ohledech zastarale |
Nejsem si uplne jisty, ale nejsou C++ knihovny napsane prave pomoci C funkci ?
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 |
|
|
Aroidzap
Založen: 14. 11. 2011 Příspěvky: 68
|
Zaslal: 10. květen 2012, 18:20:46 Předmět: |
|
|
... 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 |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 10. květen 2012, 18:29:31 Předmět: |
|
|
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 |
|
|
Vilem Otte
Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 10. květen 2012, 19:51:45 Předmět: |
|
|
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 |
|
|
|