C++字符串--Cstring
常用字符串函数
#include <iostream> #include <string> #include <tchar.h> int main() { char a[] = "ab李明"; //窄字节 wchar_t w[] = L"ab中国"; //宽字节 TCHAR t[] = _T("ab我是李明"); //通用 int na= strlen(a); //返回字符数--窄字节 // 6 一个汉字是两个字符 //不包括\0 int nw = wcslen(w); //返回字符数--宽字节 // 4 //一个汉字一个字符 //不包括\0 int nt = _tcslen(t);//返回字符数--通用 //6 随系统 //不包括\0 int x = sizeof(t); //返回占用字节数【包括\0】 //窄字节:一个汉字两个字节 //宽字节:一个字母一个汉字和\0 都是两个字节 //随系统--宽字节 char ab[] = "5437"; wchar_t wb[] = L"258"; TCHAR tb[] = _T("987"); int err=strcpy_s(a, ab); //字符串复制--窄字节 //把ab复制到a,包括结尾的\0 //a的空间要大于等于ab ,两个空间不能有重叠 ////返回值:0 表示成功----errno类型 err = wcscpy_s(w, wb);//字符串复制--宽字节 err = _tcscpy_s(t,tb); //字符串复制--通用型 int n= atoi(ab); //字符串转换成int--窄字节 n = _wtoi(wb); //字符串转换成int--宽字节 n = _tstoi(tb); //字符串转换成int--通用 std::cout << n << std::endl; //std::cout << a << std::endl; //窄字节输出 std::wcout << t << std::endl; //宽字节输出 std::string s = "我是中国人"; std::wstring ss = L"我爱中国人"; return 0; }
TCHAR ch = 'a'; BOOL b = _istlower(ch);//是否小写 //返回非0表示是小写字符 CString str; str.Format(_T("b=%d\r\n"),b); ::OutputDebugString(str); ch = 'A'; b = _istlower(ch); str.Format(_T("b=%d\r\n"), b); ::OutputDebugString(str); b = _istupper(ch);//是否大写 //返回非0表示是大写字符 str.Format(_T("b=%d\r\n"), b); ::OutputDebugString(str); ch = 'a'; b = _istupper(ch); str.Format(_T("b=%d\r\n"), b); ::OutputDebugString(str); BOOL b1 = _istascii(ch);//是否ASCII字符 //返回非0表示是ASCII字符 str.Format(_T("b1=%d\r\n"), b1); ::OutputDebugString(str); ch = '李'; b1 = _istascii(ch); str.Format(_T("b1=%d\r\n"), b1); ::OutputDebugString(str); BOOL b2=_istcntrl(ch);//是否控制字符 //返回0表示非控制字符 //返回非0表示是控制字符 (0x00 – 0x1F or 0x7F) // str.Format(_T("b2=%d\r\n"), b2); ::OutputDebugString(str); ch = VK_CONTROL; b2 = _istcntrl(ch); str.Format(_T("b2=%d\r\n"), b2); ::OutputDebugString(str); b2=_istgraph(ch);//是否可打印的非空白字符 //返回非0表示是可打印的非空白字符 str.Format(_T("b2=%d\r\n"), b2); ::OutputDebugString(str); b2 = _istprint(ch); //返回非0表示是可打印字符包括空格 str.Format(_T("b2=%d\r\n"), b2); ::OutputDebugString(str); ch = ','; int b3 = _istpunct(ch); // 返回非0表示是标点符号 str.Format(_T("b3=%d\r\n"), b3); ::OutputDebugString(str); ch = VK_SPACE; int b4 = _istspace(ch); //返回非0表示是空白字符(0x09 – 0x0D or 0x20) str.Format(_T("b4=%d\r\n"), b4); ::OutputDebugString(str); ch = 'a'; int b5 = _istxdigit(ch); //返回非0表示是十六进制数字(A – F, a – f, or 0 – 9). str.Format(_T("b5=%d\r\n"), b5); ::OutputDebugString(str);
TCHAR ch = _T('a'); TCHAR ch1= _totupper(ch);//小写字符转换成大写字符
Strcat 字符串连接函数
作用:将两个char字符数组链接,把参数2连接到参数1上
ANI: strcat_s(a,b )
Unicode: wcscat_s(str1, str2); 把str2加到str1的尾部
通用函数:_tcscat_s(str1,str2)
例子:
TCHAR ch[12] = _T("我就是李明");
TCHAR ch1[] = _T("liming");
_tcscat_s(ch,12,ch1);
SetDlgItemText(label1,ch);
参数2可以省略,ch的字符数至少=ch的字符数+ch1的字符数+1,也就是说必须有\0的字符空间
strcmp(a,b ) 字符串比较-区分大小写
格式:int strcmp(const char *s1, const char *s2);
a=b 返回值0
a>b 返回值>0
a<b 返回值<0
Unicode: int x = wcscmp(ch, ch1);
注:以上所介绍的比较字符串是否相等的函数对于英文来说是要区分大小写的,即使字母都相同但是大小写不同,函数也会认为这两个字符串是不同的
stricmp(a,b) 字符串比较-不区分大小写
a=b 返回值0
a>b 返回值>0
a<b 返回值<0
Unicode: _wcsicmp(ch, ch1)
#include <iostream> #include <string> using namespace std; int main() { char a[] = "liming"; string s = "123"; int len = strlen(a);//计算字符串str的长度(字节),直到空结束字符,但不包括空结束字符 //因为C语言是ANSI编码----一个汉字是两个字节 //参数:必须是char *类型,不能是string类型 //int n= strlen(s); 错 char c[20]; strcpy_s(c, s.c_str()); //把string 对象转换成char*字符串并复制给c //c_str()返回的是一个临时指针,不能对其进行操作 //没有改变s的类型和值 int n = strlen(c); cout << s << endl; cout << n << endl; }
字符串占用字节数
ANSI:
char ch[] = "abcdefg"; int n = sizeof(ch);//返回占用字节数【包括\0】 //窄字节:一个汉字两个字节 //宽字节:一个字母一个汉字和\0 都是两个字节 //n=8 char* pch= "abcdefg"; int nn = sizeof(pch); //注意nn=4而不是8,因为pch不是数组变量,而是指针变量,返回的是指针占用字节数 //要求指针变量指向字符串占用的有效字节数,用下面的方法 int mm = strlen(pch) * sizeof(char); //用字符数*每个字符占用的空间
Cstring
Cstring常用操作:视频教程
需要 #include <cstring>
<cstring>是C标准库头文件<string.h>的C++标准库版本,包含了C风格字符串(NUL即'\0'结尾字符串)相关的一些类型和函数的声明
CString是通过“引用”来管理字符串的,实际上CString对象只是一个指针成员变量,这个指针指向一个相关的引用内存块,所以任何CString实例的长度只有4字节,即: int len = sizeof(CString);//len等于4
注意:CString是MFC类,如果要在控制台使用该类时,需要对程序进行属性设置以及添加相应的头文件
菜单栏“项目->XXX属性”--->在项目属性页的左侧选择“配置属性->常规”,在右侧的“项目默认值->MFC的使用”的下拉菜单中,选择“在静态库中使用MFC”
添加头文件 #
以下代码在MFC中
void CCMDlg::OnBnClickedButton2() { //按钮2 CString str; //定义一个变量 str = _T("我是李四"); CString str1(_T("aAbBgG")); //定义并赋值 TCHAR ch[10] = _T("我是王五"); CString str2 = ch; //用TCHAR字符数组来初始化 TCHAR *p = _T("我是刘强"); CString str3 = p; //用TCHAR数组指针来初始化 int x = str3.GetLength(); //返回字符串的有效字符数 x=_tcslen(str3); //返回字符串的有效字符数 str3.Empty();//清空字符串 bool bl = str3.IsEmpty(); //判断字符串是否为空 //个人:不能判断TCHAR字符串 str = bl == true ? _T("True") : _T("False"); str1.MakeUpper(); //所有字符转换成大写 str1.MakeLower(); //所有字符转换成小写 str2.MakeReverse(); //反转字符串顺序 str = str1 + str2; //字符串的连接 str = str1 + ch; //与TCHAR字符串进行连接 str = _T("aBc"); str1 = _T("abc"); if (str == str1){ //判断字符串是否相等,区分大小写 SetDlgItemText(label2, _T("相等")); } else { SetDlgItemText(label2, _T("不相等")); } if (str > str1) { //判断str是否大于str1;!= 不等于;>=;<= SetDlgItemText(label2, _T("大于")); } if (str.Compare(str1)) { //内容完全一致则返回0;如果小于,则返回为-1;如果大于,则返回1,区分大小写 SetDlgItemText(label2, _T("不相等")); } else { SetDlgItemText(label2, _T("相等")); } str = _T("aBc"); str1 = _T("abc"); if (str.CompareNoCase(str1)) { //内容完全一致则返回0;如果小于,则返回为-1;如果大于,则返回1,不区分大小写 SetDlgItemText(label2, _T("不相等")); } else { SetDlgItemText(label2, _T("相等")); } //字符串的查找 str=_T("abcdefgcde"); x = str.Find(_T("cde"), 0); //x的值为2;从指定位置开始查找指定字符串,返回其位置(找不到返回-1) //只找一个 x = str.ReverseFind('e'); //x的值为9;从字符串末尾开始查找指定的字符,返回其位置,找不到返回 -1,虽然是从后向前查找,但是位置为从开始算起 x = str.FindOneOf(_T("cbd")); //x 的值为1;查找参数中给定字符串中的任意字符,返回第一次出现的位置 //提取 str1 = _T("中华人民共和国中国人"); str = str1.Left(2); //从左边提取n个字符 str = str1.Mid(0, 3); //提取指定范围的字符 //参数1 起始位置 //参数2 提取字符的个数 str=str1.Right(2); //从右边提取n个字符 //字符串的替换和删除 x=str1.Replace(_T('中'), _T('我'));//把字符串中的字符'中'都替换成'我' //返回替换的次数 str1 = _T("中华人民共和国中国人"); x= str1.Replace(_T("人民"), _T("KG")); //替换字符串 //返回替换的次数 str1 = _T("中华人民共和国中国人abcBkjh"); x = str1.Remove(_T('b'));//删除指定的所有字符,返回删除的次数,区分大小写 //只能删除字符,不能删除字符串 x = str1.Delete(1,3); //删除指定范围的字符 //参数1 起始位置 //参数2 删除的个数 //修改: str1 = _T("中华人民共和国中国人abcBkjh"); str1.SetAt(2, _T('任')); //修改指定字符 //参数1 字符序号;参数2 改成这个字符 str = str1.GetAt(1); //提取指定序号的字符 str1 = _T("中华人民共和国中国人abcBkjh"); TCHAR ch1= str1.GetAt(1); //提取指定序号的字符 str = ch1; str = str1[2]; //提取指定序号的字符 //这种形式不能修改,只能读。str1[2] = _T('D');这是错误的
//转换 //数值转换成字符串,方法一 函数,方法二 format _itot_s(x, ch, 10); //整数转换成TCHAR字符串 str.Format(_T("%d"), 100); //把数值转换成字符串 //TCHAR转换成Cstring,直接赋值就行 TCHAR ch2[] = _T("中国人"); str = ch2; //TCHAR字符串转换成Cstring字符串 str = _T("范冰冰"); TCHAR *p1= str.GetBuffer();//把Cstring字符串转换成TCHAR字符串.锁定字符串的缓冲区长度,返回字符串的地址指针 str.ReleaseBuffer();//解除锁定,使得CString对象在以后的代码中继续可以实现长度自适应增长的功能 //注意:GetBuffer()与ReleaseBuffer() 成对使用 TCHAR *p2 = (LPTSTR)(LPCTSTR)str; //把Cstring字符串转换成TCHAR字符串.返回str的地址指针 TCHAR *p3 = _T("456"); x= _ttoi(p3);//把TCHAR和CString转换成int SetDlgItemText(label1, str); SetDlgItemText(label2, p2); }
//插入
str.Insert(2, _T('x'));//把字符插入到序号2的位置
str.Insert(2, _T("abc"));//把字符串插入到序号2的位置
str1=str.SpanExcluding(_T("cf"));//返回字符串中与参数中任意字符匹配的第一个字符之前的子串
str = _T("abcdef");
str1= str.SpanIncluding(_T("fdcba")); //从字符串中查找与参数中任意字符不匹配的字符,并返回第一个不匹配字符之前的字串abcd
str.Format(_T("%d"), 13); //格式化字符串
/* CString中的GetBuffer()的用法: GetBuffer()主要作用是将字符串的缓冲区长度锁定 ReleaseBuffer则是解除锁定,使得CString对象在以后的代码中继续可以实现长度自适应增长的功能 CString::GetBuffer有两个重载版本: (1)LPTSTR GetBuffer(); (2)LPTSTR GetBuffer( int nMinBufLength ); 当调用第二个版本,设定的长度nMinBufLength小于原字符串长度nOldLen时,nMinBufLength默认等于原来字符串长度nOldLen,所以该参数会被忽略,不分配内存,指向原CString; 当设定的长度大于原字符串本身的长度时就要重新分配一块比较大的空间出来。 而调用第一个版本时,直接当做nMinBufLength=0。注意:nMinBufLength不包含最后结束的空字符 这个函数是为一个CString对象重新获取其内部字符缓冲区的指针,返回的LPTSTR为非const的,从而允许直接修改CString中的内容。如果你需要修改 CString 中的内容,可以用 GetBuffer, 它的作用是返回一个可写的缓冲指针 如果仅仅是读出CString中的内容,那么只需要用GetBuffer(0)即可。如果后面对CString还有其他操作,需要立即ReleaseBuffer */ CString csStr; LPTSTR lpsz = csStr.GetBuffer(100);//锁定长度,返回缓冲区指针 lpsz[0] = 'a'; lpsz[1] = 'b'; lpsz[2] = '\0'; csStr.ReleaseBuffer();//解除锁定 int n = csStr.GetLength(); /* n的值为2 */ CString str=_T("我是李明"); TCHAR* ch= str.GetBuffer();//把Cstring字符串转换成TCHAR字符串.锁定字符串的缓冲区长度,返回字符串的地址指针
CString转换成uint64_t
CString str = _T("123456789"); LPCTSTR lpszStr = str.GetString(); // 获取 C 风格字符串 CStringA strA(lpszStr); char* pszStr = strA.GetBuffer(); // 获取 char* 指针 char* pEnd; uint64_t value = std::strtoull(pszStr, &pEnd, 10);
string
<string>是C++标准库头文件
需要 #include <string> //没有.h
using namespace std;
//定义 string strstr = "我是谁"; wstring str;//定义字符串对象 //string 定义窄字节;wstring 定义宽字节 str = L"我是张三"; //赋值 str.assign(L"KKKGDKKK");//赋值 wstring str1(6, 'K');//定义字符串,赋值6个K TCHAR ch[10] = _T("中国人"); wstring str2(ch);//用TCHAR字符串来初始化 str.clear();//清空字符串 TCHAR *pp = _T("ABCDE"); str.assign(pp); //用TCHAR指针来赋值 str.assign(pp, 2);//用TCHAR指针来赋值,指定字符个数 str.assign(pp, 2,3);//用TCHAR指针来赋值,从第2个字符开始,复制3个字符 ch[0] = str.at(1); //提取指定序号字符 str2= str.at(1); //提取指定序号字符 str2 = str[0]; //提取指定序号字符 str2 = ch;//TCHAR字符串转换成wstring字符串,直接赋值就行 const TCHAR *p = str.c_str(); //把wstring字符串转换为TCHAR* //c_str()返回的是一个临时指针 str = L"我是张三"; int x = str.size();//返回字符串的有效字符数 bool bl = str.empty(); //判断字符串是否为空 //字符串的连接 str += L" 我喜欢看书";//字符串的连接 str = str + L" 我也喜欢看电影";//字符串的连接 str1 = L"我是中国人"; str = L"我是张三"; str.append(str1);//str1连接到str的尾部 str = L"我是张三"; TCHAR ch1[] = L"我喜欢C++"; str.append(ch1);//TCHAR字符串连接到str的尾部 str = L"我是张三"; str.append(str1,2,3);//str1连接到str的尾部,从第2个字符开始,复制3个字符 str = L"我是张三"; str.append(str1, 1); //str1连接到str的尾部, 从第1个字符开始复制 str = L"我是张三"; str.append(ch1,3);//TCHAR字符串连接到str的尾部,复制前3个字符 str = L"我是张三"; str.append(ch1, 2,3);//TCHAR字符串连接到str的尾部,从第2个字符开始,复制3个字符 //字符串的比较 str = L"abCde"; str1 = L"abcde"; bl = str == str1; // 判断字符串是否相等 // != 不等于;>;<;>=;<= wstring a(L"aBcdef"); wstring aa(L"AbcdEf"); wstring b(L"Abcdef"); wstring c(L"123456"); wstring d(L"123dfg"); int m = a.compare(b);//a减去b的ASCII码,>0返回1,<0返回-1,相同返回0 m = aa.compare(1, 3, b); // 比较 //aa从1开始拿出3个的字符串和b比较 m = a.compare(3, 3, b, 3, 3);//比较 //a从1开始拿出3个的字符串;b从1开始拿出3个的字符串;再比较 //提取 str = L"我是张三,我特别喜欢看书,我喜欢看电影"; str1=str.substr(5, 7); //提取子串 //从第5个字符开始,提取7个 str1 = str.substr(5); //提取子串 //从第5个字符开始到结尾 //查找位置 x = str.find(L"喜欢");//查找字符串,返回位置索引号 //没找到,返回 -1 x = str.find(L"喜欢",10);//查找字符串,从索引号10位置开始找.返回位置索引号 //没找到,返回 -1 x = str.rfind(L"喜欢");//查找字符串,从后往前找,返回位置索引号 //没找到,返回 -1 //替换 str1 = str.replace(6, 4, L"喜欢"); //序号6位置开始的4个字符,替换成"喜欢" //插入 str = L"我是张三"; str.insert(4, L"我喜欢看电影"); //在序号4的位置插入字符串 str = L"我是张三"; str.insert(1, 3,L'A'); //在序号1的位置插入3个字符A //删除 str = L"我是张三"; str.erase(1, 2); //从序号1开始删除2个字符
以上代码在MFC中
在MFC中使用string
需要:#include <string>
函数:
int x = sizeof(ch); 返回字符串的字节大小
包括 \0
TCHAR ch2[10];
_itot_s(x, ch2, 10); 整数转换成字符串
参数1 整数值 参数2 字符串 参数3 进制
int x = _ttoi(_T("654")); 字符串转换成整数
TCHAR ch2[10]=_T("321");
int x = _ttoi(ch2); //参数可以是TCHAR字符串、TCHAR字符串指针、Cstring字符串