Práce se stringem – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Práce se stringem – C / C++ – Fórum – Programujte.comPráce se stringem – C / C++ – Fórum – Programujte.com

 

Jana
~ Anonymní uživatel
29 příspěvků
6. 12. 2013   #1
-
0
-

Ahoj, potřebovala bych pomoct s tímto:

 Jedná se o řetězec, který určuje roky, pro které má funkce vypočítat data Velikonoc. Roky mohou být zadané buď jednotlivě nebo jako intervaly. řetězec může obsahovat více požadovaných roků/intervalů, takové jsou oddělené čárkou. Bílé znaky mimo letopočty ignorujte. Každý rok musí být vetší než 1582 (přechod na Gregoriánský kalendář) a menší než 2200. Pokud je zadaný interval, pak počáteční rok intervalu musí být menší nebo roven koncovému roku intervalu. Pokud je zadaný nesprávný vstup, funkce nic nedělá a vrací odpovídající chybový kód.

Myšleno tak, že když zadám do stringu třeba "   2006  ,   2008   ,   2009   -  2011", tak že mi to vypíše roky 2006 2008 2009 2010 2011 do pole. Ostatní si ošetřím sama, ty chybové hlášky, ale jak to rozdělit, a vypsat ty roky z toho intervalu, to nevím. Zkoušela jsem to se stringstreamem, ale bez úspěchu. Děkuji za pomoc

Nahlásit jako SPAM
IP: 85.135.117.–
vitamin+8
Grafoman
6. 12. 2013   #2
-
0
-

#1 Jana
Da sa pouzit aj stringstream:

#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <stdexcept>

using year_t = unsigned;

std::vector<year_t> parseYears(const std::string& str){
	std::istringstream iss(str);
	std::string tmp[3];
	std::vector<year_t> years;

	while(iss >> tmp[0]){
		if(iss >> tmp[1]){
			if(tmp[1] == "-"){
				if(iss >> tmp[2]){
					year_t a = std::stoul(tmp[0]);
					year_t b = std::stoul(tmp[2]);
                                        for(; a <= b; ++a)years.push_back(a);

				}
				else throw std::logic_error("parseYears error");
			}
			else if(tmp[1] == ","){
				years.push_back(std::stoul(tmp[0]));
			}
			else throw std::logic_error("parseYears error2: " + tmp[1]);
		}
		else{
			years.push_back(std::stoul(tmp[0]));
			return years;
		}
	}
        return years;
}

int main(){
    for(year_t y : parseYears( "   2006  ,   2008   ,   2009   -  2011 "))
        std::cout << y << '\n';

}
Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
paya0
Newbie
7. 12. 2013   #3
-
0
-

   

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_stl.hpp>
#include <boost/fusion/include/boost_tuple.hpp>
#include <boost/lexical_cast.hpp>
#include <string>
#include <vector>
#include <stdexcept>

namespace qi = boost::spirit::qi;
using qi::grammar;
using qi::ascii::space_type;
using boost::variant;
using boost::tuple;
using boost::static_visitor;
using boost::apply_visitor;
using std::vector;
using std::string;
using std::cout;
using std::endl;
using std::runtime_error;

typedef variant<tuple<int,int>,int> year_entry;

template<typename Iterator>
struct year_parser : grammar<Iterator, year_entry(), space_type>
{
    year_parser() : year_parser::base_type(start)
    {
        using qi::int_;
        start %= (int_ >> '-' >> int_) | int_;
    }

    qi::rule<Iterator, year_entry(), space_type> start;
};

struct year_visitor : public static_visitor<vector<int>>
{
    vector<int> operator()(const tuple<int,int> &interval) const
    {
        if (interval.get<0>() > interval.get<1>())
            runtime_error("wtf the yearz are bad!");

        vector<int> years;
        for (int year = interval.get<0>();
                 year <= interval.get<1>();
               ++year) years.push_back(year);

        return years;
    }

    vector<int> operator()(int year) const
    {
        return vector<int>{year};
    }
};

int main()
{
    string years("2034-2040,1924-1926,2312,3452,1234-1236");
    vector<year_entry> years_vec;

    typedef string::const_iterator iterator;
    iterator i = years.begin();
    year_parser<iterator> parser;
    bool result = phrase_parse(i, years.cend(), parser % ',', qi::ascii::space, years_vec);

    if (!result) throw std::runtime_error("lol the string sucks!!!");

    vector<int> all_years;
    for (auto &entry : years_vec)
    {
        vector<int> vec = apply_visitor(year_visitor(), entry);
        all_years.insert(all_years.end(), vec.begin(), vec.end());
    }

    for (auto year : all_years) cout << year << " ";
    cout << endl;

    return 0;
}
Nahlásit jako SPAM
IP: 85.171.248.–
++C > C++
vitamin+8
Grafoman
7. 12. 2013   #4
-
0
-

#3 paya
Zaujimavy kód, skoda ze sa kniznice boost/spirit kompiluju tak dlho. Kedysi som sa to snazil pouzivat pri pisani kompilatoru ale doba kompilacie ma vzdy odradila.     

Nahlásit jako SPAM
IP: 95.105.152.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
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, 46 hostů

Moderátoři diskuze

 

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