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

question-closed Polskie znaki w C++

Object Storage Arubacloud
0 głosów
1,345 wizyt
pytanie zadane 7 lipca 2019 w C i C++ przez McBezimienny Nowicjusz (120 p.)
zamknięte 9 lipca 2019 przez McBezimienny
Witam mam problem odnośnie polskich znaków w język C++. Oglądałem odc 15 na kanale Pasja Informatyki , zrobiłem wszystko tak jak było na tym filmie ale nie działa to w moim dość rozbudowanym programie. Wszystko na pewno jest wszystko poprawnie w kodzie bo, ściągnąłem paczkę plików z strony Pana Zelenta. Ma ktoś jakiś pomysł jak temu zaradzić ?

Kod użyty do działania polskich znaków :

#include <cstring>

char *tr(char *str)
  {
   static char buff[256];
   char cp[]="\245\206\251\210\344\242\230\276\253\244\217\250\235\343\340\227\275\215ąćęłńóśżźĄĆĘŁŃÓŚŻŹ";
   if(strlen(str)>=sizeof(buff)) return str;
   char *bf=buff;
   while(*str)
     {
      char *pos=strchr(cp+18,*str);
      *(bf++)=pos?*(pos-18):*str;
      ++str;
     }
   *bf=0;
   return buff;
  }
 

Dodam jeszcze, że w innych plikach mniej rozbudowanych to działa. Czy winą jest zbyt wielka ilość zmiennych typu string ? Prosiłbym o jakieś konstruktywne odpowiedzi.
komentarz zamknięcia: Rozwiązanie problemu inną metodą
komentarz 7 lipca 2019 przez j23 Mędrzec (194,920 p.)

Może sprecyzuj to "nie działa".

komentarz 7 lipca 2019 przez McBezimienny Nowicjusz (120 p.)
No po prostu nie działa, wyświetlają się różne krzaczaste znaki, tak jakby w ogóle nie było tego.
komentarz 7 lipca 2019 przez j23 Mędrzec (194,920 p.)
Jesteś w stanie pokazać przykładowy kod, w którym ta funkcja nie działa jak powinna?

 

Zakładam, że piszesz na Windowsa, bo w przeciwnym przypadku taka konwersja jest niepotrzebna.
komentarz 7 lipca 2019 przez McBezimienny Nowicjusz (120 p.)
Ogólnie to ma być dość rozbudowana mini-gra by zdobyć wiedzę i ocenę na przedmiot zawodowy na następną klasę:

(Nie wiem jak dać tą tabelkę specjalną pod kod)

Miejsca w których jest cout<<tr("")<<endl; są linijkami kodu w którym testowałem właśnie poprawne działanie polskich znaków. Chciałbym to jednak trochę zautomatyzować bo nie chce mi się wpisywać \XXX w każdym miejscu gdzie powinna być polska literka a oddawać coś tak nie dopracowanego to trochę wstyd.

#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <windows.h>
#include <cstring>

char *tr(char *str)
  {
   static char buff[256];
   char cp[]="\245\206\251\210\344\242\230\276\253\244\217\250\235\343\340\227\275\215ąćęłńóśżźĄĆĘŁŃÓŚŻŹ";
   if(strlen(str)>=sizeof(buff)) return str;
   char *bf=buff;
   while(*str)
     {
      char *pos=strchr(cp+18,*str);
      *(bf++)=pos?*(pos-18):*str;
      ++str;
     }
   *bf=0;
   return buff;
  }

using namespace std;
string imie,rasa,plec,decyzja,warunki,decyzja2,droga,cmentarz,skaly,skalywybor,skalywyborwybor;
int main()
{
    a:
    cout<<tr("Witajcie w  mojej grze")<<endl;
    o:
    cout<<tr("Podaj swoje imie: ")<<endl;
    cin>>imie;
    cout<<"Jakiej rasy jesteś ? "<<endl;
    cin>>rasa;
    cout<<"Jakiej plci jestes ?"<<endl;
    cin>>plec;
    p:
    cout<<"Twoja postac to: "<<imie<<","<<rasa<<","<<plec<<"."<<" Akceptujesz ? "<<endl;
    cin>>decyzja;
    if(decyzja=="tak")
    {
        cout<<"Przejdzmy dalej.";
    }
    else if (decyzja=="nie")
    {
        goto o;
    }
    else
    {
        cout<<"Mozliwe wybory to tylko tak i nie ."<<endl;
        goto p;
    }
        c:
        cout<<"Czy akceptujesz warunki gry ? "<<endl;
        cin>>warunki;
        if(warunki=="tak")
        {
            system("cls");
            cout<<"Od teraz mozesz grac w ta gre. Witaj podrozniku !!! "<<endl;
        }
        else if (warunki=="nie")
        {
            b:
            cout<<"Chcesz zaczac jeszcze raz czy wyjsc z gry? "<<endl;
            cin>>decyzja2;
            {

                if(decyzja2=="wyjsc")
                {
                    cout<<"To koniec. ";
                }
                else if(decyzja2=="zostac")
             {
                    goto a;
             }
                else
                {
                    cout<<"Mozliwe sa dwa warunki: zostac i wyjsc ."<<endl;
                    goto b;
                }
            }
        }
            else
            {
                cout<<"Mozesz wybrac tylko: tak lub nie . "<<endl;
                goto c;
            }
    cout<<"Przemierzasz bezkresne krainy w poszukiwaniu mitycznego artefaktu. Z legend  dowiadujesz sie,"<<endl<<"ze artefakt moze miec cos wspólnego z oddalonym miasteczkiem zwanym Zalipie."<<endl<<"Twoja podroz za chwile dobiegnie kresu. Z oddali widzisz cel swojej podrozy."<<endl<<"Stojac na wzgorzu widzisz rozciagajacy sie piekny gorzysty krajobraz. "<<" Czas ruszac. "<<endl;
    d:
    cout<<"Masz przed soba dwie mozliwe drogi; przez stary opuszczony cmentarz lub trudniejsza przez połki skalne i osuwisko."<<endl<<"Co wybierasz ? "<<endl;
    cin>>droga;
    if(droga=="cmentarz")
    {
        e:
        cout<<"Jest to stary opuszczony cmentarz, gdzies w swej drodze usłyszales, ze jest nawiedzony, chcesz sie tu udac ? "<<endl;
        cin>>cmentarz;
        if(cmentarz=="tak")
        {
            cout<<""<<endl;
        }
        else if(cmentarz=="nie")
        {
            cout<<"Postanawiasz pomyslec jeszcze raz nad swoją droga."<<endl;
            goto d;
        }
        else
        {
            cout<<"Mozesz wybrać tylko tak lub nie"<<endl;
            goto e;
        }
    }
    else if(droga=="skaly")
    {
        g:
        cout<<"Schodzisz po skalach, napewno chcesz kontynuowac ? "<<endl;
        cin>>skaly;
        if(skaly=="tak")
        {
            cout<<"Schodzisz po skalach, lecz nagle sie poslizgujesz i w ulamku sekundy musisz zadecydowac czego sie zlapac. Malego, lecz wizualnie dobrego kamienia czy masywnej galezi."<<endl;
            cin>>skalywybor;
            if(skalywybor=="kamien")
            {
                cout<<"Chwytasz sie kamienia i udaje Ci sie uniknac spadniecia lecz postanawiasz wrocic i przemyslec jeszcze raz swoja trase."<<endl;
                goto  d;
            }
            else if(skalywybor=="galaz")
            {
                f:
                cout<<"Galaz okazala się sprochniala ! Spadasz ze wzgorza obijając się o glazy i lamiąc na nich kark. Umarles. Mozesz zakonczyc gre lub wybrac inną sciezke"<<endl;
                cin>>skalywyborwybor;
                if(skalywyborwybor=="Koniec")
                {
                    cout<<"Konczysz gre"<<endl;
                }
                else if(skalywyborwybor=="Inna")
                {
                    cout<<"\n";
                    goto d;
                }
                else
                {
                    cout<<tr("Mozesz wybrać tylko : Koniec lub Inna")<<endl;
                    goto f;
                }
            }
            else
            {
                cout<<"Mozesz wybrać tylko galaz lub kamien"<<endl;
                goto g;
            }
        }
        else if (skaly=="nie")
        {
            cout<<"Wybierz inna droge: \n";
            goto d;
        }
        else
        {
            cout<<"Wyberz tylko tak lub nie \n";
            goto g;
        }
    }
    else
    {
        cout<<"Mozesz wybrac tylko : cmentarz lub skaly."<<endl;
        goto d;
    }
    return 0;
    getch();
}
komentarz 7 lipca 2019 przez j23 Mędrzec (194,920 p.)

(Nie wiem jak dać tą tabelkę specjalną pod kod)

Klikasz {...}, wybierasz język i wklejasz kod.

Powinieneś podzielić kod na funkcje, bo teraz ciężko się to analizuje. No i to nieszczęsne goto... frown

Generalnie nie widzę błędu, który by powodował nieprawidłowe działanie funkcji tr (zakładam, że jest poprawna; choć parametr i wartość zwracana powinna być const). Niewykluczone, że coś przeoczyłem.

 

Zmienne imie, rasa, plec itd. powinny być zdefiniowane jako lokalne. Nie ma powodu, by były globalne.

komentarz 7 lipca 2019 przez McBezimienny Nowicjusz (120 p.)
Dobra temat mogę zamknąć, zrobiłem trochę inaczej i uzyskałem mniej więcej zadowalający efekt. Zamiast tych dodatkowych linii kodu zmianiłem kodowanie znaków na OEM 852 za pomocą Notepad++ (co notabene jest pokazane dalej w 15 Odc u Pana Zelenta na kanale ale wcześniej tego nie zrobiłem bo myślałem,że to koniec rzeczy na Windowsie i reszta na Linuksie i MacOs)
komentarz 8 lipca 2019 przez j23 Mędrzec (194,920 p.)

Bardziej przenośne rozwiązanie to zapisać plik źródłowy w utf-8 (z BOM-em) i dodać opcję kompilatora -fexec-charset=cp852 (dla MinGW; w VC++ jest /execution-charset).

Podobne pytania

0 głosów
1 odpowiedź 877 wizyt
pytanie zadane 11 sierpnia 2020 w C i C++ przez umhum Nowicjusz (120 p.)
0 głosów
1 odpowiedź 355 wizyt
0 głosów
2 odpowiedzi 992 wizyt
pytanie zadane 26 sierpnia 2017 w C i C++ przez milosz263 Nowicjusz (240 p.)

92,576 zapytań

141,426 odpowiedzi

319,650 komentarzy

61,961 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!

...