技巧与工具02-MFC字符串相关

2022-03-02 17:24:58 浏览数 (1)

此篇主要总结了Windows下MFC编程字符串相关的一些知识,如CString, CStringList等的使用.

CString

MFC下最好用的字符串类应该就是CString了.CString是MFC中的一个类,包含了许多好用的操作如 格式化,查找,计算长度等.

要使用CString,需要在工程引用头文件:#include <afx.h>,一般放到stdafx.h预编译头中. 另外需要在项目属性中选择"在共享DLL中使用MFC".

以前有项目在VC6.0,后来迁移到VS2013,刚开始关于CString大量报错,发现是不同平台字符 编码的问题,从网上下载Multibyte MFC Library for Visual Studio 2013,安装之后,选择 多字节编码而非Unicode,即没有编码问题,CString也可以自由使用.

代码语言:javascript复制
// use_CString.c

// 初始化
CString s;
CString s("hello");
CString s = "hello";

char c[] = "hello";
CString s = "";
s.Format("%s", c);

CString s = "hello";
// 长度
// 注意:英文每个字符占一个长度,中文每个占两个长度
printf("%d", s.GetLength());    // 5

// 反转
s.MakeReverse();    // "olleh"

// 转换大小写
s.MakeUpper();      // "HELLO"
s.MakeLower();      // "hello"

// 插入 删除
s.Insert(2, "a");   // "heallo"
s.Delete(3, 2);     // "hel"

// 替换与移除指定字符
s.Replace("ll", "yy");  // "heyyo"
s.Remove('l');          // "heo"

// 去除左右两边空格
// 一般从文件读取字符串,都会先去除两端空格,防止读取无意义数据
s.TrimLeft();   // 默认去除左端空格
s.TrimRight("a");  // 去除右端的任意多个"a"

// 清空字符串以及判断字符串是否为空
// 判断是否为空也常用于读取文件
s.Empty();
s.IsEmpty();    // 为空时返回0

// 查找
s.Find('e');    // 1
s.Find('ll');   // 2
s.Find('e', 1); // 0
s.Find('a');    // 找不到返回-1
s.ReverseFind('e'); // 反向查找,即先反向再查找,3

// 格式化
s.Format("%d", 2);  // "2"

// 取值与赋值
s.GetAt(2); // "l"	如果索引越界,会出异常
s.SetAt(2, 'h');    // "hehlo"

s.Left(2);  // "he"
s.Right(2);  // "lo"
s.Mid(2, 2);    // "ll"
s.Mid(2);   // "llo"

CString与其他类型互转

CString常用于MFC,安全性高,但可移植性差 string常用于STL char * 常用于API的输入参数

代码语言:javascript复制
// convert_CString.c

// 1 CString 与 char *
CString s = "hello";
char *p = (LPSTR)(LPCTSTR)s;

char p[] = "world";
s.Format("%s", p);

// 2 CString 与 string
CString s;
string str = "hello";
s.Format("%s", str.c_str());

CString s = "hello";
string str(s.GetBuffer()); // string 类型无法用printf打印
CString.ReleaseBuffer();

// 3 char 与 string
char p[] = "hello";
string str(p);

const char *c = str.c_str();

// 4 CString 与 int
int i = atoi(s); // 转换浮点用atof
int i = _ttoi(s);

CString.Format("%d", i);

// 5 CString 与 char[100]
char a[100];
CString s("abc");
strncpy(a, (LPCTSTR)s, sizeof(a)); // vs2013报错,需要用strncpy_s

CStringList

CStringList是MFC中定义的用于存储CString字符串的链表

代码语言:javascript复制
// use_CStringList.c

// 构造
CStringList str_list;

// 添加删除元素
str_list.AddHead("123");    //在列表头部添加元素
str_list.AddTail("123");    //在列表尾部添加元素

str_list.InsertBefor(POSITION pos, "123");     // 在给定位置前插入新元素
str_list.InsertAfter(POSITION pos, "123");     // 在给定位置后插入新元素

str_list.RemoveHead();      // 分别时删除头,尾,所有元素
str_list.RemoveTail();
str_list.RemoveAll();

// 访问
str_list.GetHead();         // 获取头,尾部元素
str_list.GetTail();

str_list.GetAt(POSITION pos);           // 获取指定位置的元素
str_list.SetAt(POSITION pos);           // 设置指定位置的元素
str_list.RemoveAt(POSITION pos);        // 删除指定位置的元素

// 遍历所用
str_list.GetHeadPosition(); // 获取头部,尾部元素所在位置
str_list.GetTailPosition();

str_list.GetNext(POSITION pos);         // 获取下一个元素
str_list.GetPrev(POSITION pos);         // 获取前一个元素

// 查找
POSITION pos = str_list.Find("123");            // 获取由字符串指定的元素的位置
POSITION pos = str_list.FindIndex(int i);       // 获取由索引指定的元素的位置

// 状态
str_list.GetCount();        // 返回元素个数
str_list.IsEmpty();          // 测试列表是否为空

// 遍历
POSITION pos;
pos = str_list.GetHeadPosition();
while (pos != NULL)
{
    CString s = str_list.GetNext(pos);
    printf("%s", s);
}

附录

1 如何解决VC6迁移到VS2013时出现的error MSB8031 2 VS2008下非MFC工程使用CString类库 3 CString 成员函数用法大全 4 CString转换为LPCSTR方法补充 5 CString Format函数 VS2013 6 CString转char *,strings 7 C语言中string函数详解 8 CSTRINGLIST用法 9 CString,string,char *之间的转换 10 MFC CString 和int相互转化

感谢网上的朋友!

一个小问题

写这篇总结的时候,最后附录有十个链接,我在本地localhost测试,这十个链接只能显示六个, 而且每次刷新出来的页面还都不一样,看网页代码最后部分是乱码,改改markdown中的[]与() 之间加了空格,偶尔会正常出来十个链接,再刷新又没有了,最后deploy到github又显示正常. 暂时没有找到原因,先记下来问题,之后再处理.

0 人点赞