[C++/WinAPI] Problem z typem String

Zgodnie z opisem w kursach C++ deklaruję zmienną typu String i chcę jej nadać jakąś wartość

String napis = "napis";

ale kompilator zwraca błąd

error: `String' undeclared (first use this function)

gdzieś w necie znalazłem, że na początku jest

#include 

albo 

#include

ale wywalało ten sam błąd.

O co chodzi? Gdzie jest błąd?

Wystarczyło trochę poszukać.

http://www.intercon.pl/~sektor/cbx/std/string.html

http://en.wikipedia.org/wiki/String_(C++

#include 

#include 


using std::string;


int main()

{

    string Foo = "Lipsum.";

    Foo += " Lorem.";


    printf("%s",Foo.c_str());

};

Dobra w “czystym C++”, ale jak podpowiada temat chodzi mi o program z użyciem WinAPI.

Nie ma znaczenia czy chodzi o WinAPI, czy nie. Jedyne o czym musisz pamiętać pisząc program, to że w bibliotece win używany jest typ PSTR, czyli char*. Wymaga to użycia funkcji składowej c_str klasy string.

Jakoś nie załapałem. To znaczy co muszę zrobić, żeby móc korzystać z typu string?

Piszesz że korzystasz z WinAPI, chcesz też użyć typu string.

Czyli początek programu wygląda tak:

#include 

#include 

using namespace std; //lub using std::string

A przykład wykorzystania:

string tekst = "Aplikacja w C++";

SetWindowText(okno, tekst.c_str()); //korzystam z c_str, by "przerobić" na typ obsługiwany w WinAPI

AHA! Trzeba było tak od razu.

Zaraz spróbuję.

Dzięki

EDIT:

Działa.

I jeszcze jedno. Jak zrobić coś takiego

String napis = "C++ to język programowania wysokiego poziomu";

napis += " posiadający stringi";

(z Wikipedii), bo próbowałem tak

string napis = "Napis";

napis += " Dłuższy napis";

i tak

string napis = "Napis";

napis.c_str += " Dłuższy napis";

, i nic, nie kompiluje :frowning:

Po pierwsze: c_str jest funkcją! Czyli wymaga podania jeszcze nawiasów:

obiekt.c_str();

Po drugie: to co c_str zwróci jest typem char*, a do niego nie istnieje przeładowany operator +=. Dlatego tak długo jak chcesz wygodnie operować na stringach korzystaj z funkcji typu string, a na końcu wywołuj c_str.

dobra, ale kod:

string napis = "Napis";

napis += " Dłuższy napis";

też nie działa…

A możesz napisać co znaczy że nie działa? Kompilator wyrzuca błędy, czy wynik jest nie taki jak być powinien. Oczywiście napisz też czym kompilujesz.

Może wypadało by troszeczkę się zaznajomić, z typem char? Windowsowskie API na nim się opiera. Funkcja obj.c_str() zwraca ciąg tekstowy jako tablice typu char.

Kompiluję przy pomocy Dev-C++.

Na taki kod:

string napis = "Tekst";

napis += " numer 1";

Zwraca błędy:

#include 

#include 


using namespace std;


int main()

{

 string napis="aaa";

 napis+=" bbbb";  

 cout<
 system("PAUSE"); 


}

Powyższy kod działa bez problemu. Skopiuj u siebie i sprawdź czy działa, a jak nie to podaj jaki jest błąd.

Kompiluje, działa.

Mogę więc wnioskować że albo nie dodałeś linijki

using namespace std;

albo piszesz słowo “string” z dużej litery przy definiowaniu zmiennej i kompilator oczekuje nowej funkcji;

Powodzenia w dalszym programowaniu :slight_smile:

Używam using std::string

i piszę string (małą literą)

Próbowałem też z using namespace std;

ale ten sam błąd ;(

To jest ten błąd, czy nie? Pisałeś że w zamieszczonym kodzie błędy nie wyskakują.

W tym przykładowym (który miał sprawdzić czy kompilator jest w porządku) nie, ale tego z użyciem WinAPI nadal nie kompiluje.

Ale co znaczy z użyciem WinAPI?

W Devie (wersja 4.9.9.2) rozszerzyłem przykładowy Windowsowy program, użyłem typu string, oraz oczywiście WinAPI i działa.

http://wklej.org/id/9035146924 - ten program (pokazuje komunikat po naciśnięciu klawisza)

Teraz działa! Po prostu w złym miejscu dawałem powyższe kody!

Dzięki, pozdrawiam :smiley: