说明:下面的示例代码运行于 Win32 的控制台应用程序,在 Visual Studio 2010 里很容易通过向导建立这样一个可以使用 MFC 的控制台应用程序工程。
一. CString 类对象的初始化
1. 定义一个 CString 对象:
2. 定义一个 CString 对象,并用一个字符串进行初始化: CString str1(_T("hello"));
CString str2 = _T("world");
3. 使用数组来初始化 CString 对象:
[C++] 纯文本查看 复制代码 TCHAR szBuf[] = _T("hello world\n");
CString str3(szBuf);
CString str4 = szBuf;
_tprintf(str3);
_tprintf(str4);[/quote]
之所以数组可以通过 '=' 号直接赋值给一个对象是因为在 CString 中已经对 '=' 号进行了重载。
4. 使用指针来初始化 CString 对象:
[mw_shl_code=cpp,true]TCHAR *p = _T("hello world\n");
CString str3(p);
CString str4 = p;
_tprintf(str3);
_tprintf(str4);
5. 用一个 CString 对象去初始化另外一个 CString 对象:
[C++] 纯文本查看 复制代码 TCHAR *p = _T("hello world\n");
CString str3(p);
CString str4(str3);
CString str5(str3);
_tprintf(str4);
_tprintf(str5);
二、操作字符串的常用方法
1. 使用 GetLength() 获得字符串的长度:
[C++] 纯文本查看 复制代码 CString str = _T("hello world\n");
int str_len = str.GetLength();
printf("%d\n",str_len);
输出结果为 12 。注意,这里的 12 并不一定是 12 个字节,还可能是 24 个字节--因为采用了 UNICODE 的缘故。
2. 使用 IsEmpty() 方法判断是否为空,使用 Empty() 方法清空字符串:
[C++] 纯文本查看 复制代码 CString str = _T("你好世界\n");
BOOL isEmpty = str.IsEmpty();
if (isEmpty)
_tprintf(_T("对象为空\n"));
else
_tprintf(_T("对象非空\n"));
str.Empty();
isEmpty = str.IsEmpty();
if (isEmpty)
_tprintf(_T("对象为空\n"));
else
_tprintf(_T("对象非空\n"));
3. 使用 MakeUpper() 和 MakeLower() 来转换大小写,使用 MakeReverse() 进行翻转:
[C++] 纯文本查看 复制代码 CString str = _T("HELLO WORLD\n");
str.MakeLower();
_tprintf(str);
str.MakeUpper();
_tprintf(str);
str.MakeReverse();
_tprintf(str);
输出:hello world
HELLO WORLD
DLROW OLLEH
4. 使用 +, += 符号对字符串进行连接
[C++] 纯文本查看 复制代码 CString str = _T("ccc");
str = _T("bbb") + str + _T("ddd");
_tprintf(str);
_tprintf(_T("\n"));
str += _T("eee");
_tprintf(str);
_tprintf(_T("\n"));
TCHAR szBuf[] = _T("fff");
str += szBuf;
_tprintf(str);
_tprintf(_T("\n"));
输出:bbbcccddd
bbbcccdddeee
bbbcccdddeeefff 这两个操作符都是重载操作符。
5. 字符串比较操作符:==, !=, (<, >, <=, >= 这几个不常用), Compare 是区分大小写的比较,CompareNoCase 是不区分大小写的比较:
[C++] 纯文本查看 复制代码 CString str1(_T("hello"));
CString str2 (_T("HeLLo"));
if (str1 == str2)
_tprintf(_T("两个字符串相等\n"));
else
_tprintf(_T("两个字符串不相等\n"));
if (!str1.CompareNoCase(str2))
_tprintf(_T("两个字符串相等\n"));
else
_tprintf(_T("两个字符串不相等\n"));
输出:像 Compare 和 CompareNoCase 的比较结果,如果字符串相等,那返回值为 0 。
6. 使用 Find, ReverseFind, FindOneOf 对字符串进行查找。
6.1. Find 从指定位置开始查找指定的字符或字符串,并返回其位置,找不到则返回 -1 。
[C++] 纯文本查看 复制代码 CString str(_T("abcdefghijk"));
int pos = str.Find(_T("def"), 0);
printf ("%d\n", pos);
输出结果为 3(第 1 个字符位置为 0) 。
6.2. ReverseFind 是从字符串的末尾开始查找指定的字符(不是字符创),并返回其位置,找不到则返回 -1 。
[C++] 纯文本查看 复制代码 CString str(_T("abcdefghijk"));
int pos = str.ReverseFind('i');
printf ("%d\n", pos);
输出结果为 8 。
6.3. FindOneOf 查找参数中给定字符串中的 任意字符,返回第一次出现的位置,找不到则返回 -1 。
[C++] 纯文本查看 复制代码 CString str(_T("abcdefghijk"));
int pos = str.FindOneOf(_T("fgh"));
printf ("%d\n", pos);
输出为 5, 字符串 "fgh" 中的字符 'f' 可以从 "abcdefghijk" 中找到。如果将 "fgh" 改为 "Zgh",那么返回结果为 6,此时找的是 g 这个字符的位置。
7. 使用 Replace 替换字符或字符串,并返回替换的个数,无匹配则返回 0.
[C++] 纯文本查看 复制代码 CString str(_T("abcdefghijk"));
int num = str.Replace('d','D');
_tprintf(str);
printf ("------%d\n", num);
num = str.Replace(_T("def"), _T("DEF"));
_tprintf(str);
printf ("------%d\n", num);
输出:abcDefghijk------1
abcDefghijk------0
8. 使用 Remove 删除 CString 对象中指定的字符,并返回删除字符的个数:
[C++] 纯文本查看 复制代码 CString str(_T("abcDDefgDDxyz"));
int num = str.Remove('D');
_tprintf(str);
printf ("------%d\n", num);
输出:
9. 使用 Delete 删除 CString 对象中指定位置的字符,并返回处理后的字符串长度:
[C++] 纯文本查看 复制代码 CString str(_T("abcdefghijk"));
int num = str.Delete(3,3);
_tprintf(str);
printf ("------%d\n", num);
输出:Delete 函数有两个参数,第 1 个参数是一个索引,表示从哪个位置起开始删除,第 2 个参数表示要删除索引后面的连续几个字符。如果省略了第 2 个参数,那么默认只索引位置的那个字符。
10. 使用 Left, Mid, Right 分别从 CString 对象的左,中,右进行字符串的提取操作:
[C++] 纯文本查看 复制代码 CString str(_T("abcdefghijk"));
CString str2 = str.Left(4);
_tprintf(str2);
printf("\n");
str2 = str.Right(3);
_tprintf(str2);
printf("\n");
str2 = str.Mid(3);
_tprintf(str2);
printf("\n");
str2 = str.Mid(3, 4);
_tprintf(str2);
printf("\n");
输出:
11. 使用 GetAt 从 CString 对象中获取单个 TCHAR 类型字符,使用 SetAt 修改 CString 对象中的单个字符:
[C++] 纯文本查看 复制代码 CString str(_T("abcdefghijk"));
TCHAR ch = str.GetAt(5);
_tprintf(_T("%c\n"), ch);
str.SetAt(4, 'E');
_tprintf(str);
printf("\n");
_tprintf(_T("%c\n"), str[2]);
输出:在 SETAt 中,第 1 个参数指名了要修改字符的位置,第 2 个参数表示要替换的字符。另外,也可以使用 [ ] 操作符来获取 CString 对象中单个操作符,如 str[2] ,但这是只读的,不能修改。
12. 使用 Format 把其它类型向 CString 类型转换。
在这些转换中,可以对 int, long 等数值类型的转换,也可以对 TCHAR, TCHAR * 等类型的转换:
[C++] 纯文本查看 复制代码 int num = 10;
CString str;
str.Format(_T("%d"), num);
_tprintf(str);
输出为 10 。注意,不能直接用整数型来初始化,如 CString str(num); 。 |