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

question-closed Polskie znaki

VPS Starter Arubacloud
0 głosów
622 wizyt
pytanie zadane 27 maja 2017 w C i C++ przez Undisputed Gaduła (3,040 p.)
zamknięte 27 maja 2017 przez Undisputed

Witajcie :)
Na podstawie programu wczytywania pliku od Pana Mirosława Zelenta, zrobiłem swój własny programik, dzięki któremu można się uczyć np. stolic państw, czy też słownictwa z jakiegoś języka.
Jednak na trafiłem na problem, polega on na tym, że jeśli w pliku mam wyraz, który zawiera znak polski to nie uznaje poprawnej odpowiedzi (nic dziwnego) , tylko pytanie jak wyeliminować ten problem ? Szukałem po sieci, ale nie trafiłem na rozwiązanie problemu, być może nie umiem wciągnąć go do swojego kodu..

Kod programu:
 

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <algorithm>
#include <string>
#include <cstring>
#include <ctime>
#include <Windows.h>
#include <conio.h>
using namespace std;

string pytanie[100];
string poprawna[100];
string odpowiedz[100];
int punkty=0;
void changecolor(int number_color)
{
    HANDLE hWyj;
    hWyj=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hWyj, number_color);
}

int main()
{
//srand( time( NULL ) );
    int licznik=0;
    int nr_linii=1;
    string linia;
    int nr_pytania_poprawnego=0;
    int nr_poprawnej=0;
    int liczba_zagadnien;
    string nazwa_pliku;
    int losowana_liczba;
    fstream plik;
    plik.open("stolice.txt",ios::in);

    if (plik.good()==false)
    {
        cout<<"Nie udalo sie otworzyc pliku!";
        exit(0);
    }

    while(getline(plik,linia))
    {
            if (nr_linii%2==1)
            {
                pytanie[nr_pytania_poprawnego]=linia;
                nr_pytania_poprawnego++;
            }
            else //if(nr_linii%2==0)
            {
                poprawna[nr_poprawnej]=linia;
                nr_poprawnej++;
            }
        nr_linii++;
        licznik++;
    }
    cout << "Ile zagadnie\344: ";
    cin >> liczba_zagadnien;
    for(int k=0; k<liczba_zagadnien;k++)
    {
        changecolor(7);
        cout << pytanie[k] << endl;
        cin >> odpowiedz[k];
        if(odpowiedz[k]==poprawna[k])
        {
            changecolor(14);
            cout << "Dobrze!" << endl;
            punkty++;
        }
        else
        {
            changecolor(4);
            cout << "Zle!";
            changecolor(7);
            cout<< " Poprawna odp to: ";
            changecolor(15);
            cout << poprawna[k] << endl;
        }
    }
    changecolor(7);
    cout << "Koniec. Zdobyles " << punkty << "punktow";
}

Plik stolice.txt
 

Polska 
Warszawa
Niemcy
Berlin
Francja
Paryż
Irlandia
Dublin
komentarz zamknięcia: Znaleziono rozwiązanie
komentarz 27 maja 2017 przez OfftheCode Gaduła (4,050 p.)
Próbowałeś ?

system ("chcp 1250")

w sumie nie mam pewności czy to coś zmieni, ale warto spróbować.
komentarz 27 maja 2017 przez Undisputed Gaduła (3,040 p.)
Tak, próbowałem to nic nie daje :/
komentarz 27 maja 2017 przez Undisputed Gaduła (3,040 p.)
Tzn. Niby działa, bo jak wpiszę Paryż w konsoli to zaliczy :)
Jednak jak wpisuję ż to pojawia się w miejsce ż jakiś znaczek :/

2 odpowiedzi

0 głosów
odpowiedź 27 maja 2017 przez j23 Mędrzec (194,920 p.)

Daj na początku funkcji main wywołanie: setlocale(LC_CTYPE, ".1250"); (nie na wszystkich implementacjach biblioteki standardowej to działa, na tych nowszych z MinGW - tak)

komentarz 27 maja 2017 przez Undisputed Gaduła (3,040 p.)
Niestety to rozwiązanie też nie działa :/
komentarz 27 maja 2017 przez j23 Mędrzec (194,920 p.)
Jaki kompilator?
komentarz 27 maja 2017 przez Undisputed Gaduła (3,040 p.)
GNU GCC
komentarz 27 maja 2017 przez j23 Mędrzec (194,920 p.)
Pod Windowsem to raczej MinGW... Jaka wersja i w jakim kodowaniu masz kody źródłowe?
komentarz 27 maja 2017 przez Undisputed Gaduła (3,040 p.)
mingw32-g++

o to ci chodziło ?
Tzn. jak wkleiłem to co mi kazałeś to normalnie miałem polskie znaki, ale jak juz wpisywałem Paryż to nie zaliczało jako poprawnej odpowiedzi, bo już w stringu siedziało z niepolskim znakiem
komentarz 27 maja 2017 przez j23 Mędrzec (194,920 p.)

Znak był "polski", tylko kodowanie było inne, zapewne cp852. Dziwne frown

 

Zawsze możesz przestawić swój program na kodowanie 852, wtedy nie powinno być problemów.

0 głosów
odpowiedź 27 maja 2017 przez Undisputed Gaduła (3,040 p.)

Ok, poradziłem sobie z problemem :)

Tutaj jest rozwiązanie, może komuś się przyda :)

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <algorithm>
#include <string>
#include <cstring>
#include <ctime>
#include <Windows.h>
#include <conio.h>
using namespace std;

string pytanie[100];
string poprawna[100];
string odpowiedz[100];
int punkty=0;
void changecolor(int number_color)
{
    HANDLE hWyj;
    hWyj=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hWyj, number_color);
}
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;
 }
int main()
{
//srand( time( NULL ) );
    int licznik=0;
    int nr_linii=1;
    string linia;
    int nr_pytania_poprawnego=0;
    int nr_poprawnej=0;
    int liczba_zagadnien;
    string nazwa_pliku;
    int losowana_liczba;
    fstream plik;
    plik.open("stolice.txt",ios::in);

    if (plik.good()==false)
    {
        cout<<"Nie udalo sie otworzyc pliku!";
        exit(0);
    }

    while(getline(plik,linia))
    {
            if (nr_linii%2==1)
            {
                pytanie[nr_pytania_poprawnego]=tr(strdup(linia.c_str()));
                nr_pytania_poprawnego++;
            }
            else 
            {
                poprawna[nr_poprawnej]=tr(strdup(linia.c_str()));
                nr_poprawnej++;
            }
        nr_linii++;
        licznik++;
    }
    cout << "Ile zagadnie\344: ";
    cin >> liczba_zagadnien;
    for(int k=0; k<liczba_zagadnien;k++)
    {
        changecolor(7);
        cout << pytanie[k] << endl;
        cin >> odpowiedz[k];
        if(odpowiedz[k]==poprawna[k])
        {
            changecolor(14);
            cout << "Dobrze!" << endl;
            punkty++;
        }
        else
        {
            changecolor(4);
            cout << "Zle!";
            changecolor(7);
            cout<< " Poprawna odp to: ";
            changecolor(15);
            cout << poprawna[k] << endl;
        }
    }
    changecolor(7);
    cout << "Koniec. Zdobyles " << punkty << "punktow";
}

 

Podobne pytania

0 głosów
1 odpowiedź 860 wizyt
pytanie zadane 11 sierpnia 2020 w C i C++ przez umhum Nowicjusz (120 p.)
0 głosów
1 odpowiedź 336 wizyt
0 głosów
0 odpowiedzi 1,299 wizyt
pytanie zadane 7 lipca 2019 w C i C++ przez McBezimienny Nowicjusz (120 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...