CString
Operace související s řetězci ve stylu jazyka C
Objekt CString
obsahuje data řetězce znaků. CString
dědí sadu metod a operátorů definovaných v šabloně CStringT
třídy pro práci s řetězcovými daty. (CString
je typedef
to, která se specializuje CStringT
na práci s typem znakových dat, která CString
podporují.)
CString
neukládá data znaků interně jako řetězec zakončený hodnotou null ve stylu C. Místo toho sleduje délku znakových dat, CString
aby bylo možné data bezpečněji sledovat a prostor, který vyžaduje.
CString
přijímá řetězce ve stylu jazyka C a poskytuje způsoby přístupu k datům znaků jako řetězce ve stylu jazyka C. Toto téma obsahuje následující části, které vysvětlují, jak použít CString
objekt, jako by to byl řetězec typu C-style null-terminated.
Použití CString
jako řetězce typu C-Style Null-Terminated
Chcete-li použít CString
objekt jako řetězec ve stylu jazyka C, přetypujte objekt na LPCTSTR
. V následujícím příkladu CString
vrátí ukazatel na řetězec typu C-style null-terminated jen pro čtení. Funkce strcpy
vloží kopii řetězce stylu C do proměnné myString
.
CString aCString = "A string";
char myString[256];
strcpy(myString, (LPCTSTR)aCString);
Metody můžete například SetAt
použít CString
k úpravě jednotlivých znaků v řetězcovém objektu. LPCTSTR
Ukazatel je však dočasný a stane se neplatným, pokud dojde ke CString
změně . Rozsah CString
může být také mimo rozsah a automaticky se odstraní. Doporučujeme, abyste při každém použití získali nový LPCTSTR
ukazatel objektu CString
.
Někdy můžete vyžadovat přímou kopii CString
dat. K zkopírování CString
objektu do samostatné vyrovnávací paměti použijte zabezpečenější funkci strcpy_s
(nebo Unicode/MBCS-portable_tcscpy_s
). To je místo, kde lze bezpečně upravit znaky, jak je znázorněno v následujícím příkladu.
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
Poznámka:
Třetí argument ( strcpy_s
nebo Unicode/MBCS-portable _tcscpy_s
) je buď const wchar_t*
(Unicode), nebo const char*
(ANSI). Výše uvedený příklad předává CString
pro tento argument hodnotu. Kompilátor jazyka C++ automaticky použije funkci převodu definovanou pro CString
třídu, která převede na CString
LPCTSTR
. Schopnost definovat operace přetypování z jednoho typu do druhého je jednou z nejužitečnějších funkcí jazyka C++.
Práce s řetězcovými funkcemi standardní knihovny runtime
Měli byste být schopni najít metodu CString
pro provedení jakékoli operace řetězce, pro kterou byste mohli zvážit použití standardních funkcí knihovny runtime jazyka C, jako strcmp
jsou (nebo Unicode/MBCS-portable _tcscmp
).
Pokud je nutné použít funkce řetězce runtime jazyka C, můžete použít techniky popsané v části Použití CString
jako řetězec typu C-style null-terminated. Objekt můžete zkopírovat CString
do ekvivalentní vyrovnávací paměti řetězce ve stylu jazyka C, provést operace s vyrovnávací pamětí a potom přiřadit výsledný řetězec stylu C zpět k objektu CString
.
Přímé úpravy CString
obsahu
Ve většině situací byste měli pomocí CString
členských funkcí upravit obsah objektu CString
nebo převést na CString
řetězec znaků ve stylu jazyka C.
V některých situacích je vhodné obsah přímo upravit CString
, například když pracujete s funkcemi operačního systému, které vyžadují vyrovnávací paměť znaků.
Tyto GetBuffer
metody ReleaseBuffer
nabízejí přístup k interní vyrovnávací paměti znaků objektu CString
a umožňují ji upravit přímo. Následující kroky ukazují, jak tyto funkce používat pro tento účel.
GetBuffer
Použití a ReleaseBuffer
přístup k interní vyrovnávací paměti znaků objektu CString
Volání
GetBuffer
objektuCString
a určení délky požadované vyrovnávací paměti.Pomocí ukazatele vráceného znakem
GetBuffer
zapište znaky přímo do objektuCString
.Voláním
ReleaseBuffer
objektuCString
aktualizujte všechny interníCString
informace o stavu, například délku řetězce. Po úpravě obsahu objektuCString
je nutné volatReleaseBuffer
před voláním jiných členskýchCString
funkcí.
Použití CString
objektů s funkcemi argumentu proměnných
Některé funkce jazyka C přebírají proměnný počet argumentů. Je to velmi dobrý příklad: printf_s
. Vzhledem ke způsobu, jakým je tento druh funkce deklarován, kompilátor nemůže mít jistotu o typu argumentů a nemůže určit, která operace převodu se má provést pro každý argument. Proto je nezbytné použít explicitní přetypování při předávání CString
objektu funkci, která přebírá proměnný počet argumentů.
Pokud chcete použít objekt ve funkci argumentu CString
proměnné, explicitně přetypujte CString
na LPCTSTR
řetězec, jak je znázorněno v následujícím příkladu.
CString kindOfFruit = _T("bananas");
int howmany = 25;
_tprintf_s(_T("You have %d %s\n"), howmany, (LPCTSTR)kindOfFruit);
Zadání formálních CString
parametrů
U většiny funkcí, které potřebují řetězcový argument, je nejlepší zadat formální parametr v prototypu funkce jako const
ukazatel na znak () místo znaku CString
.LPCTSTR
Pokud je formální parametr zadán jako const
ukazatel na znak, můžete předat buď ukazatel na TCHAR
pole, literálový řetězec ["hi there"
], nebo CString
objekt. Objekt CString
se automaticky převede na objekt LPCTSTR
. Jakékoli místo, které můžete použít LPCTSTR
, můžete také použít CString
objekt.
Formální parametr můžete také zadat jako konstantní odkaz na řetězec (tj. ) v případě, const CString&
že argument nebude změněn. const
Pokud bude řetězec upraven funkcí, přetáhněte modifikátor. Pokud je požadovaná výchozí hodnota null, inicializujte ji do řetězce null [""
], jak je znázorněno níže:
void AddCustomer(const CString& name, const CString& address,
const CString& comment = _T(""));
U většiny výsledků funkce můžete jednoduše vrátit CString
objekt podle hodnoty.