• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Switch case ze string'ami

Object Storage Arubacloud
+1 głos
509 wizyt
pytanie zadane 13 maja 2021 w C i C++ przez Mavimix Dyskutant (8,390 p.)

Czy jest możliwe alby w instrukcji switch case używać stringów, coś na ten wzór:

string opcja;
cin>>opcja;

switch(opcja)
{
	case "jeden":
		//
		break;
	case "dwa":
		//
		break;
}

Gdy napiszę ten kod to pojawia się błąd "wyrażenie musi być typu całkowitego lub wyliczniowego". Wiem, że można to zrobić if else ale chcę się dowiedzieć czy jednak można do tego użyć switch case. Myślałem o tym, żeby jakoś użyć enum ale średnio wychodzi mi implementacja tego. Podsumowując - Czy jest możliwe alby w instrukcji switch case używać stringów?

2 odpowiedzi

0 głosów
odpowiedź 13 maja 2021 przez tkz Nałogowiec (42,000 p.)
wybrane 14 maja 2021 przez Mavimix
 
Najlepsza
Nie możesz użyć wyrazu w switchu. Za to podpowiedź kompilatora z typem wyliczeniowym jest dobra i warto rzucić na nią okiem. https://stackoverflow.com/questions/16388510/evaluate-a-string-with-a-switch-in-c/16388594
+1 głos
odpowiedź 13 maja 2021 przez TOM_CPP Pasjonat (22,640 p.)

Jeżeli chcesz używać typu std::string w instrukcji switch, to możesz obejść istniejące ograniczenia, ale kosztem dodatkowego kodu, który dokona konwersji stringa na typ wyliczeniowy.

[C++14]

#include <iostream>
#include <map>

using namespace std;

struct Resolve{} resolve;

enum class option { invalid, one, two };

const map<string,option> connect { {"one",option::one}, {"two",option::two} };

option operator|( Resolve , const string& text )
{
    return connect.find(text) != cend(connect) ? connect.at(text) : option::invalid;
}

int main()
{
    string text;
    cin >> text;

    switch( resolve|text )
    {
        case option::one:
             cout << "option is one";
        break;
        case option::two:
             cout << "option is two";
        break;
        default:
             cout << "No such option";
        break;
    }
}

https://wandbox.org/permlink/CoXXHtmsPWbQVEXl

komentarz 13 maja 2021 przez TOWaD Mądrala (5,700 p.)

Ja ze swojej strony dodam że niektórzy piszą, że switch jest passe. Linka nie pamiętam, ale tu coś jest. A tu już nie koniecznie.

komentarz 14 maja 2021 przez j23 Mędrzec (194,920 p.)

Lepszy switch niż drabinka if...else if.

komentarz 15 maja 2021 przez TOWaD Mądrala (5,700 p.)
edycja 15 maja 2021 przez TOWaD

Ja myślę, że wszystko jest potrzebne, ale nie wszyscy budują funkcje constexpr, a w js case"jakiś string":, to normalne i łatwe. Samym początku, nie wiedziałem, że to jest tak samo łatwe w c++, dlatego komentarz (wymyślałem jakieś dodawanie itp itd).

edit:: bo nie pasuje do opisu

#include <iostream>
#include <vector>
#include <unordered_map>
#include <functional>
struct card {
std::string figure;
std::string colour;
};
void option1(){
std::cout<<"zmienmy swiat na lepsze"<<std::endl;
return;
}
void option2() {
    std::cout << "zostawmy wszytko tak jak jest" << std::endl;
return;
}
std::unordered_map<std::string, std::function<void()>>moon {{"bojowy",option1},{"dobry",option2}};
const std::unordered_map<int, std::string> colour {{1, "karo"}, {2, "kier"}, {3, "trefl"}, {4, "pik"}};
const std::unordered_map<int, std::string> figureset {{1, "dwoka"}, {2, "trojka"}, {3, "czworka"}, {4, "piatka"}, {5, "szostka"}, {6, "sodemka"}, {7, "osemka"}, {8, "dziewatka"}, {9, "dzisatka"}, {10, "Walet"}, {11, "Dama"}, {12, "Krol"}, {13, "As"}};
const std::unordered_map<std::string, int> figure {{"dwoka", 1}, {"trojka", 2}, {"czworka", 3}, {"piatka", 4}, {"szostka", 5}, {"sodemka", 6}, {"osemka", 7}, {"dziewatka", 8}, {"dzisatka", 9}, {"Walet", 10}, {"Dama", 11}, {"Krol", 12}, {"As", 13}, {"Jocker", 14}};

const std::string line(20, '=');
using namespace std;

int main() {
    vector<card>deck;
    for(int i = 0; i < 52; i++) {
     deck.push_back({figureset.at(i % 13 + 1), colour.at(i / 13 + 1)});}
     deck.push_back({"Jocker", "red"});
     deck.push_back({"Jocker", "black"});
     for(const auto &x:deck) cout<<x.figure<<' '<<x.colour<<endl;

     if (figure.at(deck.at(5).figure)==figure.at(deck.at(18).figure)) cout<<"\nkarty sa rowne\n"<<endl;
     string strmoon;
     cout<<"jesli jestes w bojowym nastroju wpisz \"bojowy\"\n a jeśli w dobrym wpisz \"dobry\":";
     cin>>strmoon;
     try { moon.at(strmoon)();}
     catch (std::out_of_range){
      std::cout << "brak takiej opcji" << std::endl;
     }
    return 0;
}

 

komentarz 15 maja 2021 przez tkz Nałogowiec (42,000 p.)
Ale ten kod jest nieczytelny... Poza tym, wyjątki nie służą do obsługi przepływu programu, nie w ten sposób...
komentarz 16 maja 2021 przez TOWaD Mądrala (5,700 p.)
W linku był poprawny, więc po co przepisywać, a tu taka moja fantazja, no i karty lepiej w intach trzymać ale na siłę chciałem użyć unordered_map<std::string,int>. Ale jak trzeba to mogę wykasować, by nie wprowadzać błąd.
komentarz 16 maja 2021 przez TOWaD Mądrala (5,700 p.)

Ale będzie krótsza z opisem

#include <iostream>
#include <unordered_map>
#include <functional>

void option1(){
std::cout<<"zmienmy swiat na lepsze"<<std::endl;
return;
}
void option2() {
    std::cout << "zostawmy wszytko tak jak jest" << std::endl;
return;
}
std::unordered_map<std::string, std::function<void()>>moon {{"bojowy",option1},{"dobry",option2}};

using namespace std;
int main() {

     string strmoon;
     cout<<"jesli jestes w bojowym nastroju wpisz \"bojowy\"\n a jesli w dobrym wpisz \"dobry\":";
     cin>>strmoon;
     try { /*wskazujemy na funkcję (nazwa funkcji) ->*/moon.at(strmoon) /*wywołujemy funkcje i jej parametry ->*/();}
     catch (std::out_of_range){ //default tak się nie robi, zgodnie z komentrzem
      std::cout << "brak takiej opcji" << std::endl;
     }
    return 0;
}

Z drugiej jednak strony skoro błędne dane to dlaczego nie rzucić wyjątku

Podobne pytania

+3 głosów
1 odpowiedź 357 wizyt
pytanie zadane 22 października 2021 w C i C++ przez CrisGoldmann Nowicjusz (200 p.)
0 głosów
0 odpowiedzi 985 wizyt
pytanie zadane 1 listopada 2019 w C i C++ przez Hubertius Bywalec (2,970 p.)
0 głosów
2 odpowiedzi 217 wizyt
pytanie zadane 29 października 2018 w C i C++ przez xBartosz4x Nowicjusz (140 p.)

92,550 zapytań

141,394 odpowiedzi

319,522 komentarzy

61,935 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...