Udostępnij za pośrednictwem


CString Operacje odnoszące się do ciągów w stylu C

CString Obiekt zawiera dane ciągów znaków. CString dziedziczy zestaw metod i operatorów zdefiniowanych w szablonie CStringT klasy do pracy z danymi ciągów. (CString to element typedef , który specjalizuje się CStringT w pracy z rodzajem danych znaków, które CString obsługują).

CString nie przechowuje danych znaków wewnętrznie jako ciąg typu null w stylu C. Zamiast tego śledzi długość danych znaków, CString aby można było bezpieczniej obserwować dane i wymagane miejsce.

CString Program akceptuje ciągi w stylu C i zapewnia sposoby uzyskiwania dostępu do danych znaków jako ciągu w stylu C. Ten temat zawiera następujące sekcje, które wyjaśniają, jak używać CString obiektu tak, jakby był to ciąg zakończony wartością null w stylu C.

Używanie CString jako ciągu zakończonego wartością null w stylu C

Aby użyć CString obiektu jako ciągu w stylu C, rzutuj obiekt na LPCTSTR. W poniższym przykładzie CString funkcja zwraca wskaźnik do ciągu zakończonego wartością null tylko do odczytu w stylu C. Funkcja strcpy umieszcza kopię ciągu w stylu C w zmiennej myString.

CString aCString = "A string";
char myString[256];
strcpy(myString, (LPCTSTR)aCString);

Możesz użyć CString metod, na przykład , SetAtaby zmodyfikować poszczególne znaki w obiekcie ciągu. LPCTSTR Wskaźnik jest jednak tymczasowy i staje się nieprawidłowy, gdy zostanie wprowadzona jakakolwiek zmiana na CString. Element CString może również wyjść z zakresu i zostać automatycznie usunięty. Zalecamy uzyskanie nowego LPCTSTR wskaźnika CString obiektu za każdym razem, gdy go używasz.

Czasami może być wymagana kopia danych do bezpośredniej modyfikacji CString . Użyj bardziej zabezpieczonej funkcji strcpy_s (lub unicode/MBCS-portable _tcscpy_s), aby skopiować CString obiekt do oddzielnego buforu. W tym miejscu można bezpiecznie modyfikować znaki, jak pokazano w poniższym przykładzie.

CString theString(_T("This is a test"));
int sizeOfString = (theString.GetLength() + 1);
LPTSTR lpsz = new TCHAR[sizeOfString];
_tcscpy_s(lpsz, sizeOfString, theString);
//... modify lpsz as much as you want   

Uwaga

Trzeci argument do strcpy_s (lub Unicode/MBCS-portable _tcscpy_s) to const wchar_t* (Unicode) lub const char* (ANSI). Powyższy przykład przekazuje argument dla tego argumentu CString . Kompilator języka C++ automatycznie stosuje funkcję konwersji zdefiniowaną dla CString klasy, która konwertuje CString element na .LPCTSTR Możliwość definiowania operacji rzutowania z jednego typu na inny jest jedną z najbardziej przydatnych funkcji języka C++.

Praca z standardowymi funkcjami ciągów biblioteki czasu wykonywania

Należy znaleźć metodę CString wykonywania dowolnej operacji ciągu, dla której można rozważyć użycie standardowych funkcji ciągów biblioteki uruchomieniowej języka C, takich jak strcmp (lub Unicode/MBCS-portable _tcscmp).

Jeśli musisz użyć funkcji ciągów czasu wykonywania języka C, możesz użyć technik opisanych w temacie Using as a C-style null-terminated string (Używanie CString jako ciąg o wartości null w stylu C). Obiekt można skopiować CString do równoważnego buforu ciągu w stylu C, wykonać operacje na buforze, a następnie przypisać wynikowy ciąg w stylu C z powrotem do CString obiektu.

Bezpośrednie modyfikowanie CString zawartości

W większości sytuacji należy użyć CString funkcji składowych, aby zmodyfikować zawartość CString obiektu lub przekonwertować CString ciąg znaków w stylu C.

Istnieją pewne sytuacje, w których warto bezpośrednio zmodyfikować CString zawartość, na przykład podczas pracy z funkcjami systemu operacyjnego, które wymagają bufora znaków.

Metody GetBuffer i ReleaseBuffer oferują dostęp do wewnętrznego buforu CString znaków obiektu i umożliwiają jego bezpośrednie zmodyfikowanie. W poniższych krokach pokazano, jak używać tych funkcji do tego celu.

Aby użyć GetBuffer elementu i ReleaseBuffer uzyskać dostęp do wewnętrznego buforu CString znaków obiektu

  1. CString Wywołaj GetBuffer obiekt i określ długość wymaganego buforu.

  2. Użyj wskaźnika zwróconego przez GetBuffer , aby zapisać znaki bezpośrednio w CString obiekcie.

  3. Wywołaj ReleaseBuffer metodę CString , aby obiekt zaktualizował wszystkie informacje o stanie wewnętrznym CString , na przykład długość ciągu. Po bezpośredniej modyfikacji zawartości CString obiektu należy wywołać ReleaseBuffer metodę przed wywołaniem innych CString funkcji składowych.

Używanie CString obiektów z funkcjami argumentów zmiennych

Niektóre funkcje języka C przyjmują zmienną liczbę argumentów. Godnym uwagi przykładem jest printf_s. Ze względu na sposób deklarowania tego rodzaju funkcji kompilator nie może być pewien typu argumentów i nie może określić, która operacja konwersji ma być wykonywana na każdym argumencie. Dlatego podczas przekazywania CString obiektu do funkcji, która przyjmuje zmienną liczbę argumentów, należy użyć rzutowania jawnego typu.

Aby użyć CString obiektu w funkcji argumentu zmiennej, jawnie rzutuj element CString na LPCTSTR ciąg, jak pokazano w poniższym przykładzie.

CString kindOfFruit = _T("bananas");
int howmany = 25;
_tprintf_s(_T("You have %d %s\n"), howmany, (LPCTSTR)kindOfFruit);    

Określanie parametrów formalnych CString

W przypadku większości funkcji, które wymagają argumentu ciągu, najlepiej jest określić parametr formalny w prototypie funkcji jako const wskaźnik do znaku (LPCTSTR) zamiast CString. Gdy parametr formalny jest określony jako const wskaźnik do znaku, można przekazać wskaźnik do TCHAR tablicy, ciąg literału ["hi there"] lub CString obiekt. Obiekt CString zostanie automatycznie przekonwertowany na obiekt LPCTSTR. Dowolne miejsce, w którym można użyć LPCTSTRobiektu , można również użyć CString obiektu .

Można również określić parametr formalny jako odwołanie do ciągów stałych (tj. const CString&), jeśli argument nie zostanie zmodyfikowany. Upuść modyfikator, const jeśli ciąg zostanie zmodyfikowany przez funkcję. Jeśli wymagana jest domyślna wartość null, zainicjuj ją do ciągu o wartości null [""], jak pokazano poniżej:

void AddCustomer(const CString& name, const CString& address, 
   const CString& comment = _T(""));

W przypadku większości wyników funkcji można po prostu zwrócić CString obiekt według wartości.

Zobacz też

Ciągi (ATL/MFC)
CString Przekazywanie argumentów