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

Jak zapisać do zmiennej znaki polskie?

42 Warsaw Coding Academy
0 głosów
1,479 wizyt
pytanie zadane 5 grudnia 2017 w C i C++ przez maciek061 Gaduła (4,490 p.)

Witam, napisałem w C++ takiego jakby tłumacza, że wpisujemy na klawiaturze jakiś tekst, a komputer wypisuje binarne odpowiedniki kolejnych znaków, np.

INPUT

Pomidor

OUTPUT

01010000 01101111
01101101 01101001
01100100 01101111
01110010

Kod wygląda tak. I mam pytanie, jak dodać tutaj możliwość wypisywania znaków polskich? Czy da się je w ogóle zapisać w zmiennej char? Jak to najlepiej rozwiązać? 

1 odpowiedź

0 głosów
odpowiedź 5 grudnia 2017 przez criss Mędrzec (172,590 p.)

Czy da się je w ogóle zapisać w zmiennej char?

Zależy w jakim kodowaniu, ale jeśli mówisz o konsoli, to... w char nie, ale unsigned char już tak. Co też nie jest do końca prawdą, bo w przypadku char możesz po prostu używać wtedy liczb ujemnych. Dla komputera nie ma to znaczenia czy dostanie -1 jako char czy 255 jako unsigned char - oba są po prostu ośmioma jedynkami (binarnie). W przypadku wypisywania znaków nie ma to żadnego znaczenia i printując char o wartości -1, pokaże się znak o kodzie 255. Jeśli chcesz je wyświetlać na konsoli, to zobacz jakie masz tam kodowanie znaków (w polskim Windowsie domyślnie jest to chyba Latin2) i wstaw odpowiednie liczby tam gdzie chcesz mieć polski znak. Ofc. musisz mieć świadomość, że w środowisku (mam na myśli konsole) z innym kodowaniem, będą to inne znaki.

komentarz 5 grudnia 2017 przez maciek061 Gaduła (4,490 p.)

Załóżmy że mam zmienną unsigned char number; ze znakiem polskim. Czy dla niej ta pętla wykona się poprawnie? W konsoli jest kodowanie Latin2, jak pisałeś. 

for(int i=128; i>=1; i/=2)
        if(number>=i) {toReturn+="1"; number-=i;}
            else toReturn+="0";

EDIT: Pomieszało mi się. Zmienna number jest intem. Bo pobieram stringa i kolejne jego komórki wysyłam przekonwertowane na inty do funkcji. Czyli właściwie trzeba by zmienić cały program... 

komentarz 5 grudnia 2017 przez criss Mędrzec (172,590 p.)
Rozumiem, że to konwersja na system binarny? W takim razie zacznij od i=256, bo polskie znaki mieszczą się w zakresie 128..255.
komentarz 5 grudnia 2017 przez maciek061 Gaduła (4,490 p.)
Wtedy wypisuje 9 bitów
komentarz 5 grudnia 2017 przez maciek061 Gaduła (4,490 p.)
A jak w forze zmienię i>=1 na i>=2 to zjada pierwszego bita z prawej. Coś tu jest nie tak.
komentarz 6 grudnia 2017 przez criss Mędrzec (172,590 p.)

Generalnie ten twój sposób konwersji jest dość dziwny. Imo lepiej standardowo:

    while (number)
    {
        toReturn = char(number % 2 + '0') + toReturn;
        number /= 2;
    }

Wtedy dostaniesz minimalną liczbę bitów potrzebną do zapisu. Oczywiście można to zoptymalizować do jednej alokacji pamięci (przy każdym przypisaniu do `toReturn` alokujemy nową pamięć i zwalniamy starą) - zastanów się w jaki sposób :P
Jeśli koniecznie chcesz 8 bitów, to najłatwiej jest skorzystać std::bitset:

std::string toReturn = std::bitset<8>(number).to_string();

Podobne pytania

0 głosów
2 odpowiedzi 1,298 wizyt
pytanie zadane 26 sierpnia 2017 w C i C++ przez milosz263 Nowicjusz (240 p.)
0 głosów
1 odpowiedź 2,586 wizyt
0 głosów
2 odpowiedzi 2,184 wizyt
pytanie zadane 26 października 2020 w Python przez Igorek Mądrala (6,290 p.)

93,377 zapytań

142,377 odpowiedzi

322,520 komentarzy

62,724 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...