Michal M. Lechanski
Guest
Sun Oct 14, 2018 8:20 am
Dzień dobry,
switch ... case dopuszcza tylko dane typu int i char, mnie wygodnie by
było użyć String.
Czy istnieje podobna funkcja pozwalająca operować na danych typu string?
Dziękuję za sugestie.
P.S. Wiem że mogę użyć if..else.
--
Michał
Grzegorz Niemirowski
Guest
Sun Oct 14, 2018 9:46 am
Michal M. Lechanski <michal@doriath.eu> napisał(a):
Quote:
Dzień dobry,
switch ... case dopuszcza tylko dane typu int i char, mnie wygodnie by
było użyć String.
Czy istnieje podobna funkcja pozwalająca operować na danych typu string?
Dziękuję za sugestie.
P.S. Wiem że mogę użyć if..else.
Nie ma podobnej konstrukcji języka C++ dla typu string. Ale ja bym jej nawet
nie szukał. Przemapuj sobie te stringi na enumy i dopiero potem używaj w
switch..case. Pozwoli Ci to nie tylko na użycie tej konstrukcji ale też
zwiększy czytelność/koszerność kodu. Unikamy magicznych stringów i
magicznych liczb, stosujemy enumy, szczególnie w większych programach. Z
tego też względu unikamy także literałów liczbowych w switch..case.
Odpowiedni wątek na StackOverflow, ze szczególnym podkreśleniem odpowiedzi 4
(tej z 9 punktami):
https://stackoverflow.com/questions/16388510/evaluate-a-string-with-a-switch-in-c
--
Grzegorz Niemirowski
https://www.grzegorz.net/
Mateusz Viste
Guest
Sun Oct 14, 2018 10:08 am
On Sun, 14 Oct 2018 09:20:37 +0100, Michal M. Lechanski wrote:
Quote:
Dzień dobry,
switch ... case dopuszcza tylko dane typu int i char, mnie wygodnie by
było użyć String.
Czy istnieje podobna funkcja pozwalająca operować na danych typu string?
Dziękuję za sugestie.
P.S. Wiem że mogę użyć if..else.
Mi w podobnych sytuacjach zdarzało się użyć kilku rozwiązań:
- parsowanie stringa by przydzielić mu stosownego enuma, i następnie
switch() na enumie.
- kiedy stringi można rozróżnić po pierwszych 4 znakach, to zwyczajny cast
do uint32_t
- na podstawie ciągu znaków wyliczam crc32, i następnie z tej wartości
korzystam by rozpoznać jaka była (domniemana) zawartość stringa
- ostatecznie męczyć się z if (strcmp()) else if () itd...
Mateusz
Marek
Guest
Sun Oct 14, 2018 10:36 am
W dniu 14.10.2018 o 10:20, Michal M. Lechanski pisze:
Quote:
switch ... case dopuszcza tylko dane typu int i char, mnie wygodnie by
było użyć String.
Czy istnieje podobna funkcja pozwalająca operować na danych typu string?
Enum Twoim przyjacielem, który Ci pomoże:
typedef enum TZwierzaki
{
enKotki,
enPieski,
enKrowki,
enKozki,
enSwinki
};
TZwierzaki zwierzaki = enPieski; //wartość domyślna
string ZwierzakiStr = "Pieski";
Przykład użycia:
if (miaauu)
{
ZwierzakiStr = "Kotki";
zwierzaki = enKotki;
}
if (haauu)
{
ZwierzakiStr = "Pieski";
zwierzaki = enPieski;
}
switch (zwierzaki)
{
case enKotki: {
}
break;
case enPieski: {
}
break;
case enKrowki: {
}
break;
default: { //dla enKozki i enSwinki
}
}
Można też po każdym "case" wstawić funkcję konwertująca łańcuch do elementu ze zbioru
TZwierzaki (w necie pełno przykładów, wystarczy chwilę poszukać), ale powyższe rozwiązanie
jest proste, przejrzyste i daje możliwość wykorzystania zmiennej "zwierzaki" do różnych
celów, np. w GUI po rzutowaniu na int do ustawiania np. indeksu listy rozwijalnej
(ComboBox) lub po rzutowaniu indeksu z int na typ TZwierzaki do odczytu z tejże listy
wybranego zwierzęcia.
--
Pzdr.
Marek
J.F.
Guest
Sun Oct 14, 2018 11:58 am
Dnia 14 Oct 2018 10:08:15 GMT, Mateusz Viste napisał(a):
Quote:
On Sun, 14 Oct 2018 09:20:37 +0100, Michal M. Lechanski wrote:
switch ... case dopuszcza tylko dane typu int i char, mnie wygodnie by
było użyć String.
Czy istnieje podobna funkcja pozwalająca operować na danych typu string?
Dziękuję za sugestie.
P.S. Wiem że mogę użyć if..else.
Mi w podobnych sytuacjach zdarzało się użyć kilku rozwiązań:
- parsowanie stringa by przydzielić mu stosownego enuma, i następnie
switch() na enumie.
Switch z int ma te zalete, ze kompilator moze tablice skokow zrobic.
A jak parsujesz, to czy jest zysk, czy tylko strata ?
Parsowac mozna algorytmem binarnym, w if'ach to nieco trudniejsze,
ale mozna je optymalnie ustawic.
Quote:
- kiedy stringi można rozróżnić po pierwszych 4 znakach, to zwyczajny cast
do uint32_t
A potem unicode sie trafi :-)
Tu z kolei kompilator nie moze tablicy skokow ... albo nie bedzie sie
ograniczal, 100MB sobie wygeneruje :-)
Quote:
- na podstawie ciągu znaków wyliczam crc32, i następnie z tej wartości
korzystam by rozpoznać jaka była (domniemana) zawartość stringa
Metoda hash ... znana, stosowana, patrz wyzej ...
Quote:
- ostatecznie męczyć się z if (strcmp()) else if () itd...
I tu by sie przydalo jeszcze miec mniejsze i wieksze, i C troche
zawodzi.
Czy mi sie wydaje, czy w Fortranie taki trojstronny if byl ?
J.
Michal M. Lechanski
Guest
Sun Oct 14, 2018 9:06 pm
W dniu 14.10.2018 o 09:20, Michal M. Lechanski pisze:
Quote:
P.S. Wiem że mogę użyć if..else.
Dziękuję za wszystkie odpowiedzi, w końcu okazało się że tym razem
if...else zupełnie wystarczyło.
--
Michał
Mateusz Bogusz
Guest
Fri Oct 19, 2018 7:27 pm
W dniu 14.10.2018 o 23:06, Michal M. Lechanski pisze:
Quote:
Dziękuję za wszystkie odpowiedzi, w końcu okazało się że tym razem
if...else zupełnie wystarczyło.
Haha, nie dziwie się. Po takich odpowiedziach X-D
--
Pozdrawiam,
Mateusz Bogusz