C/C++笔记:std::string(一)

需求:把两个字符串拼接一下.

  • memcpy参考【C/C++笔记:动态内存分配】
	char strA[0x10] = "123";
	char strB[0x10] = "456";

	char strC[0x20];
	memcpy(strC, strA, strlen(strA));
	memcpy(strC + strlen(strA), strB, strlen(strB) + 1);

	std::cout << strC << std::endl;

1. 初始化

std::stringC++提供的字符串,利用std::string声明一个字符串:

  • #include

1.1. 初始化方法一

  • std::string 变量名称 { "字符串"};
std::string str { " 这是一个字符串" };

std::cout << str;
std::cin >> str;

1.2. 初始化方法二

  • std::string 变量名称 { "字符串", 要截取的长度};
	std::string str2 { "abcde", 3};
	
	std::cout << str2 << std::endl; // abc
	
	std::string str3 { "这是一个字符串", 4};
	
	std::cout << str3 << std::endl; // 这是

注意:截取的数据代表字节数,一个汉字是两个字节。

1.3. 初始化方法三

  • std::string 变量名称 { "字符串",起始位置, 要截取的长度};
	std::string str4 { "abcde", 1,  3};
	
	std::cout << str4 << std::endl; // bcd

注意:截取的数据代表字节数,一个汉字是两个字节。

1.4. 初始化方法四

  • std::string 变量名称 (要复制的个数,'字符');
	std::string str5 {6, 'a'};
	
	std::cout << str5 << std::endl; // 666666

2. 使用

2.1. 拼接字符串

2.1.1. 使用 “+
std::string  str {"这是一个字符串"};

str = str + "哈哈哈";

std::cout << str << std::endl; // 这是一个字符串哈哈
2.1.2. 直接拼接
#define SoftName "ADB"

#define SoftVersion "1.0"

std::string strV;

strV = SoftName SoftVersion;

std::cout << strV << std::endl; // ADB1.0
2.1.3. str.append();

.append();方法可以连接一个字符串;

  1. 常规
std::string str{ "123" };

str.append("456");

std::cout << str << std::endl; //123456

str.append("789").append("1011");

std::cout << str << std::endl; //  1234567891011
  1. append("字符串",int) 截取拼接,:截取第几个,然后再拼接;
std::string str{ "123"};

str.append("456", 1);

std::cout << str << std::endl;  // 1234
  1. append("字符串",int, int ) 截取拼接:从第几个开始,往后截取几个;
std::string str{ "123" };
	
str.append("456789", 2, 3);

std::cout << str << std::endl; //123678
  1. append(int,' 字符') 字符复数拼接
std::string str{ "123"};

str.append(5, 'a');

std::cout << str << std::endl;  // 123aaaaa
2.1.4 拼接字符串和数字

要先把数字转换成字符串;

语法:

  • std::to_string(数字);
std::string str = std::to_string(123);
2.2. 深入探讨std::string的拼接
std::string  str {"这是一个字符串"};

str = str + "哈哈哈";

str  = "123" + "456";//错误

注意:

  • 两个string能相加,是因为string类把运算符++=都重载过,++=string的重载函数。也可以把string和字符串常量相加,但必须保证每个加法运算符+的两侧的运算对象至少有一个是string。`
  • "123""456"这两个常量在内存里是char类型的数组(const char[4]),char类型的数组无法相加,所以会报错。

变通方法:

str = std::string { "123" } + "456";

str = "456" + "123" + string { "123" }; //错误

str = "456" + ("123" + string { "123" });

str += "123" + "345"; //错误
  • str = "456" + "123" + string { "123" }; //错误 加法的运算优先级是从左往右,"456""123"是不能做加法的;
  • str += "123" + "345"; //错误 运算优先级的问题,+=的优先级排在+的后面,所以同样是因为先进行"123" + "345"运算问题;

stringchar的拼接:

std::string str7{"123"};

str7 = str7 + 'a';

std::cout << str7 << std::endl;

str7 += 'b';

std::cout << str7 << std::endl;

str7 = str7 + 'w' + 'o';

std::cout << str7 << std::endl;

std::string str8{"123"};

str8 += '1' + '2';

std::cout << str8 << std::endl;  // 123c

std::string str9{"123"};

str9 += 'w' + 'o';

std::cout << str9 << std::endl; // 123   错误
  • stringchar是可以相加的(string重载的+运算符!可以对char类型进行相加!);
  • charchar 也是可以相加的(char类型本质上是整数,只是通过ASCII表限定了,两个char相加就是通过ASCII码相加)比如:str8 += '1' + '2'; 通过查ASCII'1' = 49,'2' = 50, '1' + '2' = 99 == 'c',所以str8可以打印出123c;

总结 : charchar 可以相加, char[]char[] 不可以相加;

  • str9 += 'w' + 'o';打印出错是因为 'w' +'o' = 119 + 111 = 230, 230超出了ASCII范围,所以str9只能打印出123;

2.3. 截取字符串

2.3.1 .substr();
  1. .substr(起始位置,要截取的长度);
std::string str{ "123456" };

std::string strsubA{ str.substr(1, 3) }; //strsubA = "234"
  1. 变形 .substr(起始位置); 从起始位置,往后截取全部
std::string str{ "123456" };

std::string strsubB{ str.substr(1) };   //strsubB = "23456"

2.4. 获取字符串的长度

.length()

  • 中文因为编码格式的问题,会有差异;
std::string str{ "123456" };

std::cout << str.length(); //6

2.5. 访问string字符串中的字符

std::string str {"0123456789ABC"};

str[0] = '0';

str[10] = 'A';

2.6. string字符串做比较

2.6.1.

string字符串可以用比较运算符和另一个string字符串或者C标准的字符串(char*)来进行比较;

支持的比较运算符有==!=><>=<=;

比较的原则:位依次进行字符大小的比较。

std::string str_1{ "abcde" };
std::string str_2{ "bcase" };
if (str_1 < str_2) std::cout << "str_1 < str_2" << std::endl;
2.6.2. .compare()

.compare()是string类型自带的一个方法,可以用来比较与另一个string或C标准字符串的大小,比较完成后返回的是一个int类型的值;

std::string strA{"abcd"};
std::cout << strA.compare("abcd") << std::endl;   //相比 相等 返回 0
std::cout << strA.compare("bcdfef") << std::endl; //相比 小   返回 负数
std::cout << strA.compare("ABCD") << std::endl;   //相比 大   返回 正数

.compare()的扩展用法

  • .compare(起始位置,参与比较的长度,被比较的字符串,被比较字符串的起始位置,被比较字符串的比较长度)
std::string strB{"abcd cdef ghijk"};
strB.compare(5, 4, "cdef ghijklm", 0, 4); //返回 0 表示相等 "cdef" 比较“cdef”

2.7. string字符串的搜索

2.7.1.

.find()是string类型自带的一个方法,用来搜索自负床的内容,并且返回内容所在的位置,当返回值为std::string::npos时,表示未找到

语法:

  • .find(要搜索的内容,开始搜索的位置);"开始搜索的位置"可省;
  • .find(要搜索的内容,开始搜索的位置,要纳入搜索的长度);
std::string strA{ "abcdcdef ghijk" };

std::cout << strA.find("cdef") << std::endl; // 返回 4

std::cout << strA.find("cdef",6) << std::endl; // 返回一个大数(std::string::npos),表示未找到

if (strA.find("cdef", 6) == std::string::npos) std::cout << "未找到";

//0:表示 从strA第0位开始搜索,
//2:表示 截取搜索对象的两位,即搜索“cd”,
//所以返回2;
std::cout << strA.find("cdef", 0, 2) << std::endl; //返回 2
2.7.2.

.rfind()是string类型自带的一个方法,用来 搜索字符串中的内容,并且返回内容所在的位置,当返回值位std::string::npos时,表示未找到,与find()不同的是,rfind()是从字符串的末端开始查找;

语法:

  • .rfind(要搜索的内容);
std::string strA{ "abcdcdefghijk" };
std::cout<< strA.rfind("jk");//返回11

2.8. string插入字符串

.insert()是string类型的一个方法可以在一个string字符串的指定位置插入另一个字符串;
基本语法:

  • .insert(要插入的位置,要插入的字符串);
std::string idStr{ "id=;" };
std::cout << idStr.insert(3, "testid"); //输出 : id = testid;
  • .instert(要插入的位置,要插入的字符个数,要插入的字符);
std::string id {"id=;"};
id.insert(3, 6, '*') //输出: id=******;

2.9. string替换字符串

.replace()是string 类型提供的一种方法,可以替换string字符串中的内容;

语法:

  • .replace(要替换的内容起始位置,要替换的长度,“替换后的内容”);
std::string str{ "id=user;" };
std::cout<
  • .replace(要替换的内容起始位置,要替换的长度,替换后的字符长度,'字符');
std::string str{ "id=user;" };
std::cout<
  • .replace(要替换的内容起始位置,要替换的长度,“替换后的内容”,替换后内容的节选长度);
std::string str{ "id=user;" };
std::cout << str.replace(3, 4, "zhangsan;pass=255;", 10); //id=zhangsan;p;
  • .replace(要替换的内容起始位置,要替换的长度,“替换后的内容”,替换后内容的起始位置,替换后内容的节选长度);
std::string str{ "id=user;" };
std::cout<

2.10. string删除字符串

.erase()是string类型提供的一种方法,可以删除string字符串中的内容;

语法:

  • .erase(要删除的起始位置,要删除的起始长度);
std::string str{ "id=user;" };
std::cout << str.erase(3, 4); //id=;
  • .erase(要删除的起始位置); 从起始位置开始删除所有内容
 std::string str{ "id=user;" };
std::cout << str.erase(3,); //id=
  • .erase(); 删除字符串所有内容;
  • .clear(); 删除字符串所有内容。

2.11. string字符串转换为数字

2.12. stringstream

std::stringstream定义在头文件中;std::cout组织数据的形式有些时候要比string字符串要方便。

std::stringstream可以像std::cout一样组织数据;

std::stringstream.str()方法将会返回一个string,里面是std::stringstream的内容;

std::stringstream strSt;
strSt << "你好" << 123;
std::string _str = strSt.str();
std::cout << _str; // 你好,123

3. 字符串的应用

std::string str{"id=usrId;pass=qwerr;role=Tom"};
   std::string strIn;
   std::string strOut;
   while (true)
   {
   	std::cout << "请输入您要查阅的属性\n";
   	std::cin >> strIn; //输入属性的字段如“id”;
   	int lfind = str.find(strIn + "=");
   	if (lfind == std::string::npos)
   		std::cout << "对不起,您要查阅的属性不存在";
   	else 
   	{
   		int lend = str.find(";", lfind);
   		strOut = str.substr(lfind + strIn.length() + 1, lend - lfind - strIn.length() - 1);
   		std::cout << strOut << std::endl;
   	}
   }

C/C++笔记:std::string(一)_第1张图片

  1. 需求:输入中英文混合字符串,输出字符串的长度(比如:" hello你好 ",输出:7 )。
std::string strIn;
std::cin >> strIn;
int length{ 0 };
for (int i = 0; strIn[i]; i++)
{
	if (strIn[i] < 0)i++;
	length++;
}
std::cout << length;

你可能感兴趣的:(C/C++,c++,c语言)