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

Polskie znaki dla wyrazów znajdujących się w zmiennej string.

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
2,606 wizyt
pytanie zadane 18 marca 2017 w C i C++ przez bp181 Nowicjusz (160 p.)

Witam. Piszę z problemem dotyczącym polskich znaków w konsoli. Mianowicie wczytuję z pliku tekstowego do zmiennej string napis z polskimi znakami. Wyświetlając go w konsoli pokazują się krzaki. Chciałem załatwić to za pomocą funkcji tr(nazwa_zmiennej) jednak to nie działa. Pojawia się error: cannot convert 'std::string {aka std::basic_string<char>}' to 'char*' for argument '1' to 'char* tr(char*)'|. Prosił bym o pomoc w wymyśleniu jakiegoś sposobu.

PROGRAM:

int main()
{
    string kk;
    fstream plik;
    plik.open("dokument.txt", ios::in);
    string linia;
    getline(plik, linia);
    kk=linia;
    cout <<linia<< endl;
    return 0;
}

FUNKCJA TR:

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;
  }

 

1 odpowiedź

0 głosów
odpowiedź 18 marca 2017 przez JKluseczka Obywatel (1,430 p.)

Zrób tak:

cout<<strdup(tr(linia.c_str()))<<'\n';

 

komentarz 18 marca 2017 przez bp181 Nowicjusz (160 p.)

Znowu error: invalid conversion from 'const char*' to 'char*' [-fpermissive]|

komentarz 18 marca 2017 przez JKluseczka Obywatel (1,430 p.)

sry odwrotnie napisałem :)

cout<<tr(strdup(linia.c_str()))<<endl;

 

komentarz 18 marca 2017 przez bp181 Nowicjusz (160 p.)

Dzięki wielkie! Działa. wink

1
komentarz 18 marca 2017 przez j23 Mędrzec (195,240 p.)
edycja 18 marca 2017 przez j23

A po co to strdup tam? Użycie tej funkcji w taki sposób powoduje wyciek pamięci, a to błąd.

std::string tr(const char *str)
{
	const char * cp = "\245\206\251\210\344\242\230\276\253\244\217\250\235\343\340\227\275\215ąćęłńóśżźĄĆĘŁŃÓŚŻŹ";
	
	std::string buff;

	while(*str)
	{
		char *pos = strchr(cp + 18, *str);
		buff.push_back( pos ? *(pos - 18) : *str );
		++str;
	}

	return buff;
}

// użycie
cout << tr( linia.c_str() ) << '\n';

 

Można dodać jeszcze taką wersję dla std::stringa:

std::string& tr(std::string &str)   // nie tworzy kopii, działa na stringu źródłowym
{
	const char * cp = "\245\206\251\210\344\242\230\276\253\244\217\250\235\343\340\227\275\215ąćęłńóśżźĄĆĘŁŃÓŚŻŹ";
	
	std::string::iterator i1 = str.begin();
	std::string::iterator i2 = str.end();

	while(i1 != i2)
	{
		char *pos = strchr(cp + 18, *i1);
		*i1 = pos ? *(pos - 18) : *i1;
		++i1;
	}
	
	return str;
}

// użycie
cout << tr(linia) << '\n';

cout << tr("śćźżół") << '\n'; // <-- poprzednia wersja

 

komentarz 19 marca 2017 przez JKluseczka Obywatel (1,430 p.)
edycja 19 marca 2017 przez JKluseczka
strdup() bo chciał to dla funkcji char* tr(char*)

a Ty zmieniłeś funkcję tr() ;)

Ale przyznaję rację Twój pomysł jest lepszy
komentarz 19 marca 2017 przez mokrowski Mędrzec (158,660 p.)
A dlaczego nie std::transform(...) ?
komentarz 19 marca 2017 przez j23 Mędrzec (195,240 p.)

@JKluseczka, tak, ale wtedy wystarczyłoby chamskie rzutowanie, albo po prostu dodanie const do parametru.

@mokrowski, chciałem użyć std::transform, ale pomyślałem, że dla jasności przekazu lepiej będzie przerobić funkcję tak, żeby OP wiedział, co tam się dzieje.

Podobne pytania

0 głosów
2 odpowiedzi 1,333 wizyt
pytanie zadane 26 sierpnia 2017 w C i C++ przez milosz263 Nowicjusz (240 p.)
0 głosów
2 odpowiedzi 825 wizyt
0 głosów
1 odpowiedź 1,501 wizyt
pytanie zadane 5 grudnia 2017 w C i C++ przez maciek061 Gaduła (4,490 p.)

93,439 zapytań

142,431 odpowiedzi

322,677 komentarzy

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

...