CString
Операции, связанные со строками в стиле C
Объект CString
содержит символьные строковые данные. CString
наследует набор методов и операторов, определенных в шаблоне CStringT
класса для работы со строковыми данными. (CString
является тем typedef
, который специализируется CStringT
на работе с типом символьных данных, которые CString
поддерживают.)
CString
не обеспечивает внутреннее хранение символьных данных как строка с завершающим нулевым байтом в стиле C. Вместо этого CString
отслеживает длину символьных данных, чтобы безопаснее контролировать эти данные и требуемое им место.
CString
принимает строки в стиле C и предоставляет способы для доступа к символьным данным как строке в стиле C. В этом разделе содержатся следующие подразделы, в которых описано использование объекта CString
, как если бы он являлся строкой с завершающим нулевым байтом в стиле C.
Преобразование в строки, завершаемые значением NULL в стиле C
Работа со стандартными функциями строк библиотеки времени выполнения
Использование
CString
объектов с функциями аргументов переменной
Использование CString
в качестве строки, завершаемой значением NULL в стиле C
Чтобы использовать CString
объект в качестве строки в стиле C, приведение объекта к объекту LPCTSTR
. В следующем примере CString
возвращает указатель на строку с завершающим нулевым байтом в стиле C, доступную только для чтения. Функция strcpy
помещает копию строки в стиле C в переменную myString
.
CString aCString = "A string";
char myString[256];
strcpy(myString, (LPCTSTR)aCString);
Вы можете использовать методы CString
, например SetAt
, для изменения отдельных символов в объекте строки. LPCTSTR
Однако указатель является временным и становится недействительным при измененииCString
. CString
также может выйти за пределы области, после чего выполняется его автоматическое удаление. Рекомендуется получать свежий LPCTSTR
указатель CString
объекта при каждом использовании.
Иногда вам может потребоваться копия данных CString
для непосредственного внесения изменений. Используйте более защищенную функцию strcpy_s
(или переносимую между Юникодом и многобайтовой кодировкой _tcscpy_s
) для копирования объекта CString
в отдельный буфер. Именно здесь можно безопасно изменить символы, как показано в следующем примере.
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
Примечание.
Третий аргумент strcpy_s
(или переносимый _tcscpy_s
Юникод/MBCS) — это либо const wchar_t*
(Юникод) или const char*
an (ANSI). Приведенный выше пример передает CString
для этого аргумента. Компилятор C++ автоматически применяет функцию преобразования, определенную для класса CString
, который преобразует CString
в LPCTSTR
. Возможность определения операций приведения от одного типа к другому — это одна из самых полезных особенностей C++.
Работа со стандартными функциями строк библиотеки времени выполнения
Вы должны иметь возможность найти метод CString
для выполнения строковой операции, для которой может потребоваться использование стандартных строковых функций библиотеки времени выполнения, таких как strcmp
(или переносимой между Юникодом и многобайтовой кодировкой _tcscmp
).
Если необходимо использовать строковые функции времени выполнения C, можно использовать методы, описанные в статье Using CString
as a C-style null-terminated string. Вы можете скопировать объект CString
в эквивалентный строковый буфер в стиле C, выполнить операции в этом буфере, а затем снова назначить полученную строку в стиле C объекту CString
.
Изменение содержимого CString
напрямую
В большинстве ситуаций для изменения содержимого объекта CString
или для преобразования CString
в символьную строку в стиле C следует использовать функции-члены CString
.
В некоторых ситуациях имеет смысл напрямую изменить содержимое CString
, например, при работе с функциями операционной системы, требующими символьный буфер.
Методы GetBuffer
и ReleaseBuffer
предоставляют доступ к внутреннему символьному буферу объекта CString
и позволяют изменять его напрямую. Приведенные ниже действия показывают, как использовать такие функции в этих целях.
GetBuffer
Использование и ReleaseBuffer
доступ к внутреннему буферу символов CString
объекта
Вызовите
GetBuffer
для объектаCString
и укажите требуемую длину буфера.Используйте указатель, возвращенный
GetBuffer
, для записи символов напрямую в объектCString
.Вызовите
ReleaseBuffer
для объектаCString
, чтобы обновить все внутренние сведения о состоянииCString
, например длину строки. После непосредственного изменения содержимого объектаCString
необходимо вызватьReleaseBuffer
до вызова любых других функций-членовCString
.
Использование CString
объектов с функциями аргументов переменной
Некоторые функции C принимают переменное число аргументов. Ярким примером этого является printf_s
. Из-за способа объявления этого вида функции компилятор не может быть уверен в типе аргументов и не может определить, какую операцию преобразования требуется выполнить для каждого аргумента. Таким образом, вам важно использовать явное приведение типа при передаче объекта CString
в функцию, которая принимает переменное число аргументов.
Чтобы использовать CString
объект в функции аргумента переменной, явно приведение CString
к LPCTSTR
строке, как показано в следующем примере.
CString kindOfFruit = _T("bananas");
int howmany = 25;
_tprintf_s(_T("You have %d %s\n"), howmany, (LPCTSTR)kindOfFruit);
Указание формальных CString
параметров
Для большинства функций, которым требуется строковый аргумент, в прототипе функции в качестве указателя const
на символ (LPCTSTR
) вместо CString
лучше всего указать формальный параметр. Если формальный параметр указан в качестве const
указателя на символ, можно передать указатель TCHAR
на массив, литеральную строку ["hi there"
], или CString
объект. CString
Объект будет автоматически преобразован в объектLPCTSTR
. Любое место, где можно использовать LPCTSTR
объект, можно также использовать CString
объект.
Можно также указать формальный параметр в виде ссылки на константную строку (т const CString&
. е. ), если аргумент не будет изменен. Удалите модификатор, const
если строка будет изменена функцией. Если требуется использовать по умолчанию значение NULL, инициализируйте его с нулевой строкой [""
], как показано ниже:
void AddCustomer(const CString& name, const CString& address,
const CString& comment = _T(""));
Для большинства результатов функции вы можете просто возвратить объект CString
по значению.