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 , SetAt
aby 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
CString
WywołajGetBuffer
obiekt i określ długość wymaganego buforu.Użyj wskaźnika zwróconego przez
GetBuffer
, aby zapisać znaki bezpośrednio wCString
obiekcie.Wywołaj
ReleaseBuffer
metodęCString
, aby obiekt zaktualizował wszystkie informacje o stanie wewnętrznymCString
, na przykład długość ciągu. Po bezpośredniej modyfikacji zawartościCString
obiektu należy wywołaćReleaseBuffer
metodę przed wywołaniem innychCString
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ć LPCTSTR
obiektu , 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.