Více hodnot v jedné proměnné – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Více hodnot v jedné proměnné – C / C++ – Fórum – Programujte.comVíce hodnot v jedné proměnné – C / C++ – Fórum – Programujte.com

 
Hledat
Moderní platforma pro vytvoření vašeho nového webu – Wix.com.
Nyní už můžete mít web zdarma.
Vybavení pro Laser Game
Spuštěn Filmový magazín

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Spuštěný nový filmový web Filmožrouti.cz — vše o Avengers, Pacific Rim, Thor, Star Wars…
richard.zavodny0
Návštěvník
2. 4. 2017   #1
-
0
-

Zdravím, opět jsem narazil na problém. :(

Mám string, který potřebuji rozsekat podle znaku ";". To se podaří, ale potřebuji k samotným rozděleným hodnotám přistupovat zvlášť, takže vytvořit novou proměnnou pro každou hodnotu zvlášť. Problém ale je, že proměnná s obsahuje více hodnot, které nevím jak rozdělit, nebo jak k nim přistupovat zvlášť. Strukturu vstupních dat znám.
 
Můj kód:

std::vector<std::string> strings;
std::istringstream f("This;is;string");
std::string s;

while(std::getline(f, s, ';')) {
    cout << s << "\n";
    strings.push_back(s);
}


Díky za rady. :)

Nahlásit jako SPAM
IP: 109.81.208.–
Programátor, Kóder, Grafický designér, Kritik, zastánce Open-Source a Linuxu.
KIIV
~ Moderátor
+42
God of flame
2. 4. 2017   #2
-
0
-

Proc ses porad tak zamerenej na "samostatne promenne"? Kdyz mas vektor, tak muzes k jednotlivym polozkam pristupovat pomoci indexu. Pokud nahodou potrebujes i nejake pojmenovani hodnot, pouzij mapu.

Nahlásit jako SPAM
IP: 94.113.99.–
Program vždy dělá to co naprogramujete, ne to co chcete...
richard.zavodny0
Návštěvník
2. 4. 2017   #3
-
0
-

#2 KIIV
Nevím. Asi se mi s tím dobře pracuje. :)

Omlouvám se (pro některé) za tak tupý dotaz, ale stále jsem ve fázi učení, takže mnoho věcí zatím neznám a nevím jak na ně.

Nahlásit jako SPAM
IP: 109.81.208.–
Programátor, Kóder, Grafický designér, Kritik, zastánce Open-Source a Linuxu.
KIIV
~ Moderátor
+42
God of flame
2. 4. 2017   #4
-
0
-

#3 richard.zavodny
no ja mam spis problem pochopit na co to presne potrebujes. Co vlastne resis a proc myslis ze potrebujes samostatne promenne? Tys zatim popsal jen ze delas split a chces to mit v promennych.

Proste vedet ceho chces presne dosahnout dost pomohlo na to, abysme ti rekli ja se to da udelat.

Nahlásit jako SPAM
IP: 94.113.99.–
Program vždy dělá to co naprogramujete, ne to co chcete...
richard.zavodny0
Návštěvník
3. 4. 2017   #5
-
0
-

#4 KIIV
Funkčnost tohoto fóra na mobilním zařízení je hrůza. Tento příspěvek píšu už potřetí, tentokrát již z PC, tak se to snad podaří odeslat...

Ale k věci... Mám program, který čte ze souboru a data ukládá do proměnné typu string (to mám "ošéfované"), soubor je ve formátu neco1;neco2;neco3, takže jednotlivé data potřebuji rozdělit dle znaku ;, což se zadaří. A teď nastává můj problém. Proměnnou s, která obsahuje celkem tři hodnoty uložit buď každou hodnotu do samostatné proměnné, nebo do pole s tím, že ke každé hodnotě budu přistupovat pomocí indexu pole. Když zkusím vypsat proměnnou s jako s[0], s[1] a s[2], tak mi to vypíše použe prvý, druhý a třetí znak poslední hodnoty (tj. neco3) v proměnné s.

Snad je to pochopitelné. :)

Nahlásit jako SPAM
IP: 109.81.208.–
Programátor, Kóder, Grafický designér, Kritik, zastánce Open-Source a Linuxu.
Řešení
KIIV
~ Moderátor
+42
God of flame
3. 4. 2017   #6
-
0
-
Vyřešeno Nejlepší odpověď

#5 richard.zavodny
jo to je lepsi. V s mas ale jen aktualni retezec, je to sice pole, ale pole znaku.

Pokud pouzijes tu promennou strings misto s, tak mas mnohem lepsi sanci, ze tam bude to co chces.

Nahlásit jako SPAM
IP: 212.47.3.–
Program vždy dělá to co naprogramujete, ne to co chcete...
3. 4. 2017   #7
-
0
-

ale tvůj vektor se jmenuje strings... 

zase pozdě :(

hu

Nahlásit jako SPAM
IP: 195.178.67.–
richard.zavodny0
Návštěvník
3. 4. 2017   #8
-
0
-

#6 KIIV
No, další problém na obzoru. :(

Přepsal jsem to tak jak jsi radil, ale moc funkční to teda není. když vypíšu proměnnou strings[0], tak mi to sice vypíše "This", ale třikrát za sebou. Pokud ale vypíšu proměnnou strings[1], nebo strings[2], tak mi program vyhodí "Segmentation fault (core dumped)". Taktéž to musím "pushnout" (strings.push_back(s)), jinak to vyhodí tu stejnou chybu.

Aktuální kód:
 

std::vector<std::string> strings;
std::istringstream f("This;is;string");
std::string s;

while(std::getline(f, s, ';')) {
    strings.push_back(s);

    cout << strings[0] << "\n";
}
Nahlásit jako SPAM
IP: 109.81.208.–
Programátor, Kóder, Grafický designér, Kritik, zastánce Open-Source a Linuxu.
KIIV
~ Moderátor
+42
God of flame
3. 4. 2017   #9
-
+1
-
Zajímavé

#8 richard.zavodny
Tady je nekolik zpusobu, jak to vypsat:

#include <iostream>
#include <vector>
#include <string>

int main() {
    std::vector<std::string> strings;
    std::istringstream f("This;is;string");
    std::string s;

    while(std::getline(f, s, ';')) {
        strings.push_back(s);
    }

    std::cout << "Vypsani pomoci klasickeho indexu: \n";
    for (int i = 0; i < strings.size(); ++i) { 
        std::cout << strings[i] << "\n";
    }

    std::cout << "Vypsani pomoci iteratoru: \n";
    for (std::vector<std::string>::iterator it = strings.begin(); it != strings.end(); ++it) { 
        std::cout << *it << "\n";
    }

#if __cplusplus >= 201103L

    std::cout << "Vypsani pomoci iteratoru v c++11 (pouziti typu auto): \n";
    for (auto it = strings.begin(); it != strings.end(); ++it) { 
        std::cout << *it << "\n";
    }

    std::cout << "Vypsani pomoci for each loopu v c++11: \n";
    for (std::string & str : strings) { // at se zbytecne nevytvari kopie
        std::cout << str << "\n";
    }

    std::cout << "Vypsani pomoci for each loopu v c++11 za pomoci auto: \n";
    for (auto & str : strings) { // at se zbytecne nevytvari kopie
        std::cout << str << "\n";
    }

#endif

}

Vychytavky z C++11 standardu jsem nechal jako podminenou kompilaci, kdo vi, co na to pouzivas, tak at neni dalsi prispevek "nejde to zkompilovat"

Jo poznamka: zjistovani size() v podmince cyklu je v tomto pripade jeste v pohode, jelikoz zjisteni velikosti u vektoru je rychle. Pokud bys ale pouzival klasicke C retezce, tak strlen by to pekne pocitalo v kazdem kole a pri necem vetsim by to bylo silene pomale.

Nahlásit jako SPAM
IP: 212.47.3.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+42
God of flame
3. 4. 2017   #10
-
+1
-
Zajímavé

Jo a taky se da pouzit par drobnosti z hlavicek  algorithm a iterator:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>

int main() {
    std::vector<std::string> strings;
    std::istringstream f("This;is;string");
    std::string s;

    while(std::getline(f, s, ';')) {
        strings.push_back(s);
    }

    std::cout << "Taktez se daji pouzit vychytavky z knihovny algorithm a iterator:\n";
    std::copy(strings.begin(), strings.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
}

kde std::ostream_iterator<std::string>(std::cout, "\n")  je vystupni iterator, ktery pri kazdem prirazeni do nej, vypise danny string na std::cout a prilepi za nej "\n".

A std::copy si snad domyslis co dela.

Nu a pokud bys chtel vedet, jak se da vypisovat naposledy pridany prvek:

    while(std::getline(f, s, ';')) {
        strings.push_back(s);

        std::cout << strings.back() << "\n";
    }
Nahlásit jako SPAM
IP: 212.47.3.–
Program vždy dělá to co naprogramujete, ne to co chcete...
richard.zavodny0
Návštěvník
3. 4. 2017   #11
-
0
-

Jaj, já jsem ale pako! :D Já si totiž neuvědomil, že se mi to string[0] loopuje, takže se pokaždé vypíše jedna a ta samá hodnota ("This").

Teď už to jede tak, jak potřebuji: 

std::vector<std::string> strings;
std::istringstream f("This;is;string");
std::string s;

while(std::getline(f, s, ';')) {
    strings.push_back(s);
}

cout << strings[0] << "\n";
cout << strings[1] << "\n";
cout << strings[2] << "\n";


Ještě jednou se omlouvám, za tak banální dotaz. :)

+1

Nahlásit jako SPAM
IP: 109.81.208.–
Programátor, Kóder, Grafický designér, Kritik, zastánce Open-Source a Linuxu.
3. 4. 2017   #12
-
+1
-
Zajímavé

#11 richard.zavodny
což je v podstatě toto: 

std::cout << "Vypsani pomoci klasickeho indexu: \n";
    for (int i = 0; i < strings.size(); ++i) { 
        std::cout << strings[i] << "\n";
    }

Kód jsem okopíroval od KIIV z #9. Cyklus je šikovnější, umí se přizpůsobit počtu prvků vektoru.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
richard.zavodny0
Návštěvník
6. 4. 2017   #13
-
0
-

A ještě jsem zapomněl poděkovat...

Díky moc. :)

Nahlásit jako SPAM
IP: 109.81.208.–
Programátor, Kóder, Grafický designér, Kritik, zastánce Open-Source a Linuxu.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 66 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032017 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý