C++字符串--窄字节宽字节--Cstring_git


#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;
}

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;
}


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”

C++字符串--窄字节宽字节--Cstring_赋值_02


添加头文件    #include <afxwin.h>  

需要注意的是,如果项目中还用到了Windows.h头文件,那么在包含头文件时,afxwin.h必须在Windows.h之前

【Cstring这个类不建议在控制台用,总是出错】

 以下代码在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);


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);    //格式化字符串 




string

​视频教程1​

​视频教程2​

<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中


函数:

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字符串