Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Zmienna wstring


Rekomendowane odpowiedzi

Opublikowano

Witam. Mam problem ze zmienną wstring. Poniższy kod :

#include <iostream>
#include <string>

using namespace std;


int main()
{
   wstring napis= L"Jakiś napis";
   wcout << napis;

   return 0;
}

nie chce się skompilować z powodu takich błędów.

converting to execution character set: Illegal byte sequence|
In function `int main()':|
error: `wcout' was not declared in this scope|
||=== Build finished: 2 errors, 0 warnings ===|

W kursie z którego się uczę piszę żeby strumień cout wypisał zmienną wstring trzeba dopisać do niego 'w'. W takim bądź razie dlaczego powyższy kod nie chce się skompilować ? I jak zapisać i używać znaków unicode za pomocą wstring ?

Opis w kursie : http://imageshack.us/f/845/65375031.png/

Środowisko : Code::Blocks

 

Może tutaj będzie ktoś w stanie mi pomóc ;/

Kocham mpcforum.pl!!!

18706.png

Opublikowano

Możesz użyć takiej funkcji:

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

using namespace std;

char * PL(char * str)
{
   static char buf[50000];
   CharToOem(str, buf);
   return buf;    
}

main()
{
   cout << PL("ĘÓŁŚĄŻŹĆŃ << ęółśążźćń\n\n");
   getch(); 
}

lub ręcznie kodować znaki...

Opublikowano

To nie zmienia faktu że tamten kod powinien działać i o to mi najbardziej chodzi. Poza tym już mniej więcej wiem w czym leży problem można zamknąć. saviola136 + za starania i chęć pomocy.

Kocham mpcforum.pl!!!

18706.png

Opublikowano

a dodałeś wstring.h ?

Bo jakoś nie widzę ;)

@2up

zachwilę Osama się przyczepi że nie każdy ma conio.h ;)

Cytat

 

Orientacja seksualna polega na tym, że jeden mężczyzna lubi blondynki, drugi szatynki, że jedna pani woli umięśnionych mężczyzn a inna chudych intelektualistów. Homoseksualizm nie jest orientacją jest chorobą za którą homoseksualiści nie ponoszą odpowiedzialności. Pewna grupa ludzi rodzi się upośledzona fizycznie, na przykład bez ręki ale czy to znaczy, że wszystkim zdrowym powinniśmy też obcinać ręce? Nie, powinniśmy zapewnić im protezy. Obowiązkiem państwa jest zapewnienie homoseksualistom, jak wszystkim upośledzonym fizycznie czy psychicznie profesjonalnej opieki medycznej.

Opublikowano

Po dodaniu wstring.h

wstring.h: No such file or directory|
converting to execution character set: Illegal byte sequence|
|In function `int main()':|
error: `wcout' was not declared in this scope|
||=== Build finished: 3 errors, 0 warnings ===|

Kocham mpcforum.pl!!!

18706.png

Opublikowano

sry. Chyba chodziło mi o wchar.h

Cytat

 

Orientacja seksualna polega na tym, że jeden mężczyzna lubi blondynki, drugi szatynki, że jedna pani woli umięśnionych mężczyzn a inna chudych intelektualistów. Homoseksualizm nie jest orientacją jest chorobą za którą homoseksualiści nie ponoszą odpowiedzialności. Pewna grupa ludzi rodzi się upośledzona fizycznie, na przykład bez ręki ale czy to znaczy, że wszystkim zdrowym powinniśmy też obcinać ręce? Nie, powinniśmy zapewnić im protezy. Obowiązkiem państwa jest zapewnienie homoseksualistom, jak wszystkim upośledzonym fizycznie czy psychicznie profesjonalnej opieki medycznej.

Opublikowano

Po dodaniu wchar.h

converting to execution character set: Illegal byte sequence|
In function `int main()':|
error: `wcout' was not declared in this scope|
||=== Build finished: 2 errors, 0 warnings ===|

Kocham mpcforum.pl!!!

18706.png

Opublikowano

w śmiesznym kodzie z tego tematu udało mi się jakoś zaciągnąć polskie znaki do działania - kopiując na chama biblioteki i setlocale:

#include <iostream>
#include <locale.h>
#include <wchar.h>
#include <wctype.h>

using namespace std;


int main()
{
setlocale(LC_ALL,"POLISH");

wcout << L"Jakiś napis\n";
system("pause");

return 0;
}

udało mi się wyświetlić tekst(nagłówki możesz metodą prób i błędów pokasować, a nóż któryś jest zbędny)

ps.jak to rozwiązanie nie będzie Ci działać, zmień IDE na te od ms

Opublikowano

jest cos takiego jak 'help' w c++, gdzie mozna zobaczyc spis funkcji i ich zastosowanie??

 

+ dlaczego to nie dziala:D

#include <iostream>

using namespace std;

main()
{
   string imie;
 cout << "podaj imie: " << endl;
 cin >> imie;

 int i = 0;
do
{
    if(imie[i] == "a")
    {

       cout  << "To :" <<  i << endl;
    }
    i++;
 } while(i<=5);//tyle w moim przypadku



   return 0;
}

Do
$wiek+=1
Until ŻycieGetMsg() = -3

zbieram +

Opublikowano

main() spróbuj zamienić na int main()

 

I druga sprawa, w twoim kodzie imie nie jest tablic. (rozumiem, że to może być użycie poszczególnych liter bo w końcu string to łańcuch charów)

Opublikowano

Tzn dzis sie uczylem petli in zapisow if robilem wyswietlanie kazdej litery z osobna w kontoli przez imie i dzialo a teraz mi wyskakuje ze nie mozna porownywac wskaznika z int ale ja nie chce i== "a" tylko tablice o danym z "a" , a co do helpa to ktos wie orientuje? :)

Do
$wiek+=1
Until ŻycieGetMsg() = -3

zbieram +

Opublikowano

(rozumiem, że to może być użycie poszczególnych liter bo w końcu string to łańcuch charów)

broń boże, string to

String objects are a special type of container, specifically designed to operate with sequences of characters.

 

jest cos takiego jak 'help' w c++, gdzie mozna zobaczyc spis funkcji i ich zastosowanie??

Za taką dokumentację może posłużyć ta strona.

while(i<=5);//tyle w moim przypadku

nie polecam takiego postępowania, gdy obsługujesz jakiegoś stringa to lepiej zawsze zakres określać przez <nazwastringa>.size() czy .length()

A co do kodu - C++ jest czułe na punkcie apostrofów, więc gdy stosujesz ", C++ zawsze uważa to za ciąg znaków którego typ to wskaźnik, a przy porównywaniu pojedynczych znaków powinieneś skorzystać z pojedynczego apostrofu, tj.'a'

 

 

Opublikowano
String z angielskiego znaczy dosłownie ciąg, sznur, więc jednym ze sposobów w jakim można mówić o tym typie to ciąg znaków. Innymi określeniami są łańcuch znaków lub po prostu łańcuch.

 

łańcuch charów = łańcuch znaków = string

 

Wydaje mi się, że moje stwierdzenie jest poprawne ...

Opublikowano

To odpal sobie w takim razie cwaniaku taki kod:

#include <iostream>
#include <string>

using namespace std;


int main()
{
char* ciagznakow = "Hello, world!";
string ciagznakow2 = "Hello, world!";
printf(	"Ciag 1:%s\n"
		"Ciag 2:%s\n", ciagznakow, ciagznakow2); 
system("pause");
}

(nie stosuję couta bo ma przeciążony operator do stringów)

jakby nie chciało działać, prawda?

z prostej przyczyny:string nie jest ciągiem znaków samych w sobie, jest OBIEKTEM który jest zaprojektowany do pracy ze znakami - w nim kryje się jeszcze .length(), .at(), string w porównaniu do normalnego ciągu znaków(czyli tablicy znaków/wskaźnika null-terminated) potrafi obsłużyć partię nowego tekstu, gdy takowy dołożymy - przy statycznych tablicach i wskaźnikach to się po prostu nie zmieści, a gdy nie mamy zaimplementowanej myśli "że cholera, to może się nie zmieścić!", to może nas spotkać ten słynny buffer overflow.

A żeby z obiektu zwanego stringiem uzyskać klasyczny ciąg znaków trzeba skorzystać z membera zwanego .c_str(), i powyższy kod w tym wypadku zadziała.

Opublikowano
jest cos takiego jak 'help' w c++, gdzie mozna zobaczyc spis funkcji i ich zastosowanie??

http://www.cplusplus.com/reference/

 

Natomiast, jeśli chodzi ci o funkcje WinApi, to:

google.pl/search?q=WinApi%20MSDN

 

ciąg znaków którego typ to wskaźnik

Pierwsze słyszę o ciągu znaków, którego typem jest wskaźnik. Czy chodziło ci może o zdanie:

Gdy używasz znaku ", kompilator rezerwuję miejsce w pamięci równe długości łańcuchu tekstu (ew. *2 dla wchar's) i zwraca wskaźnik na pierwszy (dwu-)bajt zarezerwowanego miejsca, natomiast literały znakowe deklaruje się za pomocą znaku ' ?

 

powinieneś skorzystać z pojedynczego apostrofu

Nie istnieje coś takiego jak podwójny apostrof.

 

 

 

@Teesik vs Sopelek:

Oczywiście w błędzie jest Teesik. Myśli o STL'owym stringu, i przytaczasz bardzo, bardzo wąską definicję dot. pojedynczej implementacji.

Mylisz terminy i wykłucasz sie nie mając racji. Gratuluję, naprawdę sie pan popisal. Najdziwniejsze jest to, że w ostatniej chwili nawet zakłada popełnienie błędu "A żeby z obiektu zwanego stringiem" ale szybko kończy wypowiedź, jakby przeczuwając zbliżające się olśnienie ....

 

A przytoczony kawałek programu nie działa, ponieważ funkcja printf jako 2...n argument przyjmuje (const)char*.

 

http://pl.wikipedia.org/wiki/String

http://en.wikipedia.org/wiki/CString

Tutaj masz o tym, czym naprawdę jest string ( w informatyce ) a nie o tym, "czym jest obiekt std::string w STL'u C++".

Ta sygnatura jest pusta.

Opublikowano
Nie istnieje coś takiego jak podwójny apostrof.

Oczywiście że nie, nawet nonsensopedia definiuje podwójny apostrof jako cudzysłów. Przyznaję, mój błąd.

Pierwsze słyszę o ciągu znaków, którego typem jest wskaźnik. Czy chodziło ci może o zdanie:

Gdy używasz znaku ", kompilator rezerwuję miejsce w pamięci równe długości łańcuchu tekstu (ew. *2 dla wchar's) i zwraca wskaźnik na pierwszy (dwu-)bajt zarezerwowanego miejsca, natomiast literały znakowe deklaruje się za pomocą znaku ' ?

Sam Pan(właśnie, kwestia pisowni zwrotów grzecznościowych - Poradnia PWN'u definiuje iż co prawda obie formy są akceptowane, jednakże są zależne od grzeczności piszącego - czyżby cechował się Pan brakiem kultury, Panie 4ggr35510n?) przytoczył link do Wikipedii, która stwierdza:

W C łańcuchy reprezentuje się jako tablice znaków a operacje na nich wykonuje z użyciem wskaźników.

Pańska definicja jest i owszem, poprawna w przypadku inicjalizacji ciągów znakowych, jednakże nie uwzględnia ona przypadku, w którym inicjalizacja wskaźnika następuje w przypadku podania adresu(na ten sam adres, czy też przesuniętego o jakiś offset) - cóż w takim przypadku się stanie? Dlatego też byłbym bardziej skłonny do uznania wersji z Wikipedii, która zresztą jest bardziej bliższa mojej wersji, nieprawdaż?

Myśli o STL'owym stringu, i przytaczasz bardzo, bardzo wąską definicję dot. pojedynczej implementacji.

Tak?

Zacytuję(z kolorkami) mój tekst:

w nim kryje się jeszcze .length(), .at(), string w porównaniu do normalnego ciągu znaków(czyli tablicy znaków/wskaźnika null-terminated) potrafi obsłużyć partię nowego tekstu, gdy takowy dołożymy - przy statycznych tablicach i wskaźnikach to się po prostu nie zmieści, a gdy nie mamy zaimplementowanej myśli "że cholera, to może się nie zmieścić!", to może nas spotkać ten słynny buffer overflow.

Teraz dla odmiany zacytuję tekst z artykułu znajdującego się na przytoczonej przez Pana Wikipedii:

"Ukrywa" ona niewygodne aspekty używania napisów w stylu C: zarządzanie pamięcią, określanie długości, łączenie napisów, wstawianie, usuwanie i inne manipulacje na napisie. Dodatkowo pozbyto się problemu znaku kończącego - znak o kodzie \0 może być elementem napisu std::string (długość przechowywana jest oddzielnie)

3 cechy na 6? Cholera, wyjątkowo wąska definicja - jednakże na swoją obronę mogę powiedzieć to, że nie spodziewałem się tego, że powinienem z pamięci wymieniać wszystkie cechy tego jakże zacnego obiektu. Co do przytaczania "pojedynczej" definicji, Wikipedia dalej wspomina iż:

Ponieważ biblioteka standardowa (bazująca w tym zakresie na STL) została dość późno dołączona do oficjalnego standardu, wiele kompilatorów dostarcza własne implementacje typów napisowych - np. String, AnsiString, CString. Również niektóre starsze biblioteki (jak np. Qt) dostarczają własnych typów obsługi napisów.

Mam rozumieć że znajomość standardowych bibliotek do obsługi ciągów znakowych nie wystarczy i powinienem być zaznajomiony z nimi wszystkimi? Kurczę, my piszemy o programowaniu, czy łapaniu pokemon... standardów?

Najdziwniejsze jest to, że w ostatniej chwili nawet zakłada popełnienie błędu "A żeby z obiektu zwanego stringiem" ale szybko kończy wypowiedź, jakby przeczuwając zbliżające się olśnienie

Niestety mylnie zinterpretował Pan moje zamiary - według mnie, klasa std::string jest wedle definicji z tejże strony(cytowanej już zresztą wcześniej), obiektem(kontenerem, będąc dosłownym) przeznaczonym do obsługi ciągów znakowych, a przytaczając funkcję c_str() należącą do klasy string chciałem jedynie podać rozwiązanie, w jaki sposób można uzyskać ciąg znaków z tegóż obiektu.

Nie kwestionuję sensu istnienia klasy o którą toczymy spór, jednakże pytaniem jest czy możemy nazywać ciągiem znaków coś co "zawiera" w sobie 30~ funkcji i 4 iteratory? Według mnie - nie, ciąg znaków w języku C++ może odegrać jedynie tablica znaków, czy też wskaźnik na ciąg (dwu)bajtowych znaków.

Uprzedzając też pewne pytania zacytuję też fragment tekstu z przytoczonego przez Pana fragmentu:

W C++ oprócz tradycyjnych ciągów znaków w stylu C istnieje w bibliotece standardowej klasa std::string.

Wikipedia nie neguje że możemy się posługiwać ciągami znaków w C++(aczkolwiek z mojego punktu widzenia jest to naganne stylistycznie), jednakże wyraźnie określa że std::string jest klasą a nie ciągiem znaków.

 

Na koniec w ramach wzajemnej uprzejmości życzliwie zwrócę uwagę na pewną rzecz(pomijając fakt że od "a więc" zdania się nie zaczyna):

wykłucasz sie nie mając racji

Słowa "wykłucać" raczej nie znajdzie Pan słowniku, prawda? ;)

Opublikowano

Działa juz 'a' :D

#include <iostream>

using namespace std;

main()
{
 string imie;
 cout << "podaj imie: " << endl;
 cin >> imie;
cout << imie.size() << endl;
 int i = 0;
do
{
    if(imie[i] == 'a')
       return i;


    i++;

 } while(i <= imie.size());//tyle w moim przypadku


}

Do
$wiek+=1
Until ŻycieGetMsg() = -3

zbieram +

Opublikowano

@up Oczywiście, że nie ma sensu, nie do tego został stworzony ten temat :)

Offtop: Witaj z powrotem Jatokor :)

Wydaje mi się, że ktoś powinien zamknąć ten temat, za dużo niepotrzebnej złości a problem w początkowym poście został już rozwiązany....

Opublikowano
Wydaje mi się, że ktoś powinien zamknąć ten temat, za dużo niepotrzebnej złości a problem w początkowym poście został już rozwiązany

phi, złość! po prostu dyskusja ^^ i osobiście wolę rozmawiać na temat czy string jest klasą, aniżeli roztrząsać "kurczę, który kompilator jest najlepszy?" czy "mam plik ini, jak z tego zrobić mmo?" lub "która książka jest najlepsza od początkujących?" ew."od jakiego języka zacząć, no ej nie linkuj mi tu do jakichś porządnych stron na których temat jest wyczerpany tylko chcę znać twoje zdanie, ziomek", bo zadane któryś raz z rzędu, takie pytanie stają się po prostu...nudne.

Aczkolwiek zdaję sobie sprawę z tego że moje zdanie nie ma nic do rzeczy, i modek z pewnością lada chwila zamknie ten temat - pozdrawiam Cię serdecznie :*

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...