十七、C++字符串(二)

这篇具有很好参考价值的文章主要介绍了十七、C++字符串(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

十七、C++字符串(二)

1、字符串的应用

需求:设计一个程序,用户输入属性id或者pass或者role可以把对应的内容显示出来,给定字符串如下:

string str{"id=user;pass=632105;role=郝英俊;"};


//设计一个程序,用户输入属性id或者pass或者role可以把对应的内容显示出来
#include <iostream>
#include <string>
using std::string;
int main()
{
    string str{ "id=user;pass=632105;role=郝英俊;" };
    string strIn;
    string outPut;

    while (true)
    {
        std::cout << "请输入你要查找的属性:";
        std::cin >> strIn;
        int lfind;    //find()函数查找的值是一个整数,不是字符串
        lfind = str.find(strIn + "=");
        if (lfind == std::string::npos)std::cout << "你查找的属性不存在";
        else
        {
            int lend = str.find(";",lfind);
           outPut = str.substr(lfind + strIn.length() + 1, lend - lfind - strIn.length() - 1);
            std::cout << "你查找的" << strIn << "属性的值为:" << outPut << std::endl;
        }
    }
}

十七、C++字符串(二)

2、string函数补充

1)string插入字符串

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

//插入字符串基本语法
.insert(要插入的位置,要插入的字符串);
string id{"id=;"}
id.insert(3,"testid");    //在第3个字符的位置插入字符串testid,最后id的值为id=testid

//插入字符串的高级用法
.insert(要插入的位置,要插入的字符个数,要插入的字符);
string id{"id=;"}
id.insert(3,6,'*');   //在第3个位置插入6个*号,最后id的值为id=******
//insert()字符串插入函数基本用法
#include <iostream>
#include <string>
using std::string;

int main()
{
	string strA { "id=;" };
	strA.insert(3, "user");
	std::cout << "字符串strA插入后的字符串为:" << strA << std::endl;

	string strB{ "id=;" };
	strB.insert(3,6,'*');  //此处插入的是字符,不是字符串,所以要使用单引号
	std::cout << "字符串strB插入后的字符串为:" << strB << std::endl;

}

十七、C++字符串(二)

2)insert插入字符串的扩展用法

//insert()扩展用法语法
.insert(要插入的位置,要插入的字符串,要插入的字符串的起始位置,要插入的大小);
string id{"id=;"};
id.insert(3,"killertestid123456",6,6);  //id=testis

.insert(要插入的位置,要插入的字符串,要插入的大小);
string id{"id=;"};
id.insert(3,"killertestid123456",6);  //id的值为id=killer  从开始位置截取6个字符
//insert()扩展用法示例
#include <iostream>
#include <string>
using std::string;

int main()
{
	string strA{ "id=;" };
    //在原字符串的第三个位置开始插入,插入的内容为此处字符串的第6个位置开始截取,截取6个
	strA.insert(3, "killertestid123456", 6, 6);
	std::cout << "字符串strA插入后的字符串为:" << strA << std::endl;

	string strB{ "id=;" };
     //在原字符串的第三个位置开始插入,插入的内容为此处字符串的第0个位置开始截取,截取6个
	strB.insert(3, "killertestid123456", 6);  //此处插入的是字符,不是字符串,所以要使用单引号
	std::cout << "字符串strB插入后的字符串为:" << strB << std::endl;

}

十七、C++字符串(二)

3、指针数组字符串

1)string字符串不是一个单纯的指针或者数组

#include <iostream>
#include <string>
using std::string;
int main()
{
	string str{ "12345" };
	std::cout << "字符串中第1个字符的值为:" << str[0] << std::endl;
	std::cout << "字符串中第2个字符的值为:" << str[1] << std::endl;
	std::cout << "字符串中第3个字符的值为:" << str[2] << std::endl;
	std::cout << "字符串的地址为:" << (int)&str << std::endl;
	std::cout << "str[0]的地址为:" << (int)&str[0] << std::endl;
	std::cout << "str[0]的地址为:" << (int)&str[1] << std::endl;
	
	str = str + "abcdesdajhdhjakd";
	std::cout << "字符串长度增加后的地址为:" << (int)&str << std::endl;
	std::cout << "字符串长度增加后str[0]的地址为:" << (int)&str[0] << std::endl;
	std::cout << "字符串长度增加后str[0]的地址为:" << (int)&str[1] << std::endl;
}
/*结果显示:
如果str的地址和str[0]的地址一致,说明str相当于一个数组
但是str的地址和str[0]的地址不一样,说明str不是一个简单的数组,
从str[0]的地址开始,地址才是连续的
当字符串长度增加后,str的地址不变,但是str[0]开始,后面的每个字符的地址都会变化
*/

2)获取string字符串的指针

​ 在内存里的布局,与C字符串(char*)不同的是,C字符串以0结尾,而string字符串由于专门记录其长度的属性,在实现的时候,并没有严格要求是否以0结尾。但是在C++11标准推出后,要求string字符串也以0结尾

​ 通过.c_str()方法可以得到一个const char*的指针指向str储存字符数据的内存空间(返回的是一个常量指针,只能写不能读)

​ 通过.data()方法可以得到一个const char*的指针指向str储存字符数据的内存空间

​ 在c++17标准下,.data()方法得到的是一个char*的指针

#include <iostream>
#include <string>
using std::string;
int main()
{
	string str{ "12345" };

	const char* baseStrA = str.c_str();
	const char* baseStrB = str.data();
	std::cout << "字符串的地址为:" << (int)&str << std::endl;
	std::cout << "通过c_str获取的字符串地址为为:" << (int)baseStrA << std::endl;
	std::cout << "通过c_str获取的字符串地址为为:" << (int)baseStrB << std::endl;

}

十七、C++字符串(二)

3)string替换字符串的内容

​ .replace是string类型提供的一种方法,可以替换string字符串中的内容。语法如下

//replace()字符串替换语法
.replace(要替换的内容起始位置,要替换的程度,"替换后的内容");
string str{"id=user;"};
str.replace{3,4,"zhangsan"}; //从原字符串的第三个位置开始,替换四个字符,替换内容为新的字符串

//replace()其他语法
.replace(要替换的内容起始位置,要替换的长度,替换后的字符长度,'字符');
str.replace(3,4,6,'*'); //str的内容为:id=******
//replace()字符串替换函数基本用法
#include <iostream>
#include <string>
using std::string;

int main()
{
	string strA{ "id=user;" };
	//在原字符串的第3个位置开始替换,替换后面的4个字符
	strA.replace(3, 4, "zhangsan");
	std::cout << "字符串strA替换后的字符串为:" << strA << std::endl;

	string strB{ "id=user;" };
	//在原字符串的第3个位置开始替换,替换后面的4个字符,并替换为6个*号
	strB.replace(3, 4, 6, '*');  //此处插入的是字符,不是字符串,所以要使用单引号
	std::cout << "字符串strB替换后的字符串为:" << strB << std::endl;
}

十七、C++字符串(二)

4)replace()函数的扩展用法

//replace()函数的扩展语法
.replace(要替换的内容起始位置,要替换的长度,"替换后的内容",替换后内容的节选长度);
string str{"id=user;"};
str.replace(3,4,"zhangsan;pass=255;",8); //str=zhangsan

//replace()函数的扩展语法
.replace(要替换的内容起始位置,要替换的长度,"替换后的内容",替换后内容的起始位置,替换后内容的节选长度);
string str{"id=user;"};
str.replace(3,4,"zhangsan;pass=255;",5,3); //str=san;
#include <iostream>
#include <string>
using std::string;

int main()
{
	string strA{ "id=user;" };
	//在原字符串的第3个位置开始替换,替换后面的4个字符
	strA.replace(3, 4, "zhangsan;pass=255;", 8); 
	std::cout << "字符串strA替换后的字符串为:" << strA << std::endl;

	string strB{ "id=user;" };
	strB.replace(3, 4, "zhangsan;pass=255;", 5, 3);  
	std::cout << "字符串strB替换后的字符串为:" << strB << std::endl;
}

十七、C++字符串(二)

5)字符串的删除

​ erase()是string类型提供的一种方法,可以删除string字符串中的内容,语法如下:

//字符串的删除erase()函数语法一
.erase(要删除的起始位置,要删除的起始长度);
string str{"id=user;"};
str.erase(3,4);   //std为id=;

//从起始位置开始删除所有内容
.erase(要删除的起始位置);
string str{"id=user;"};
str.erase(3);   //std为id=

.earse();删除字符串所有内容
.clear();删除字符串所有内容
4、字符串补充

1)字符的存储及读取

​ 字符串再C/C++的学习中一直是一个比较麻烦的点,但是只要知道"计算机中万物皆数字",则所有的问题都可以迎刃而解。

​ 字符的存储:先通过编码表转化为数子,再把数字转化为二进制进行存储(字符->编码表->二进制数字)

​ 字符的读取:先把二进制数字读取出来,再根据编码表转化为字符(二进制数字->编码表->字符)

​ 字符编码表:ASCII、GBK、UNICODE

2)练习

​ 需求:设计一个程序,要求用户输入中英文混合内容,正确的计算出长度并显示出来。比如用户输入:你好,我的世界。结果输出为7。

​ 思路:因为字符的ASCII码范围为0-127,只要超过127就表明是一个中文字符

#include <iostream>
#include <string>
using std::string;
int main()
{
	string strIn{};
	std::cout << "请输入计算长度的字符串:";
	std::cin >> strIn;
	int length{};
	for (int i = 0; strIn[i]; i++)
	{
		if (strIn[i] < 0)i++;
		length++;
	}
	std::cout << "你输入的字符串长度为:" << length << std::endl;
}

十七、C++字符串(二)

2)string字符串转化为数字

通过std::to_string(数字)可以将数字转化为字符串。通过一下函数可以将字符串转化为数字

作用 语法 用法
将字符串转化为int std::stoi(字符串) int a=stoi("123")
将字符串转化为long std::stol(字符串) long a=stol("123")
将字符串转化为long long std::stoll(字符串) long long a=stoll("123");
将字符串转化为unsigned long std::stoul(字符串) unsigned long a=stoul("123")
将字符串转化为unsigned long long std::stoull(字符串) unsigned long long a=stoull("123")
将字符串转化为float std::stof(字符串) float a=stof("123")
将字符串转化为double std::stod(字符串) double a=stod("123")
将字符串转化为long double std::stold(字符串) long double a=stold("123")

将字符串转化为数字后,可以进行计算

#include <iostream>
#include <string>
using std::string;
int main()
{
	string strIn{};
	std::cout << "请输入计算长度的字符串:";
	std::cin >> strIn;
	int length{};
	for (int i = 0; strIn[i]; i++)
	{
		if (strIn[i] < 0)i++;
		length++;
	}
	std::cout << "你输入的字符串长度为:" << length << std::endl;
}

十七、C++字符串(二)

3)stringstream流

​ std::stringstream流定义在<sstream>头文件中,std::cout组织数据的形式有时候要比string字符串要方便。std::stringstream可以像std::cout一样组织数据。std::stringstream.str()方法将会返回一个string,里面是std::stringstream的内容,即将流中的内容提取出来

//stringstream流语法
std::stringstream str;
str<<"你好"<<123;
std::string _str=str.str();  //_str的内容为"你好123"
//stringstream流简单使用
#include <iostream>
#include <string>
#include <sstream>
using std::string;

int main()
{
	std::stringstream strA;
	strA << "你好 [" << std::hex << 500 << "]   "<<std::dec<<123;
	string strB = strA.str();
	std::cout << strB;
}

十七、C++字符串(二)

5、游戏麟江湖排行榜设计

​ 需求:我们通过网络获得了麟江湖游戏玩家的数据,现在我们要为我们的游戏设计一个战力(exp)排行榜系统,排序贵u则为战力由高到低,当战力相同时,根据ID的字母顺序进行排序(如A要排在B的前面)数据如下:

"id=TomyClare;exp=9523;id=Sunny;exp=9523;id=DyBaby;exp=25301;id=Simple;exp=25301;id=Bkacs11;exp=2100;id=DumpX;exp=36520;"

​ 根据这个数据生成玩家排行榜!

#include <iostream>
#include <string>
using std::string;

typedef struct Role 
{
	string Id;
	int Exp;
}*PROLE;

int main()
{
	string strData{ "id=TomyClare;exp=9523;id=Sunny;exp=9523;id=DyBaby;exp=25301;id=Simple;exp=25301;id=Bkacs11;exp=2100;id=DumpX;exp=36520;" };
	int istart{}, iend{}, icount{};
	for (int i = 0; i < strData.length(); i++)
	{
		if (strData[i] == ';')
		{
			icount++;
			i += 3;
		}
	}
	PROLE pRole = new Role[icount / 2];
	icount = 0;
	do 
	{
		istart = strData.find("id=", istart);
		if (istart == std::string::npos) break;
		iend = strData.find(";", istart + 3);
		pRole[icount].Id = strData.substr(istart + 3, iend - istart - 3);
		istart = iend + 1;
		istart = strData.find("exp=", istart);
		iend = strData.find(";", istart + 4);
		pRole[icount++].Exp = std::stoi(strData.substr(istart + 4, iend - istart - 4));
		istart = iend + 1;
	} while (true);
	
	//冒泡排序
	for (int i = 1; i < icount; i++)
	{
		for (int j = 1; j < icount; j++)
		{
			if (pRole[j].Exp > pRole[j - 1].Exp)
			{
				Role tmp = pRole[j - 1];
				pRole[j- 1] = pRole[j];
				pRole[j] = tmp;

			}
		}
	}
	for (int i = 1; i < icount; i++)
	{
		std::cout << pRole[i].Id << "  " << pRole[i].Exp << std::endl;
	}
}

十七、C++字符串(二)文章来源地址https://www.toymoban.com/news/detail-747100.html

到了这里,关于十七、C++字符串(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++将字符串中包含指定字符串范围内的字符串全部替换

    将指定字符串所在的范围之内的字符串全部替换为指定的字符串。如: 源字符串: 转换后的字符串: 或者转换为: 本文就是记录一种将上述字符串替换成功的方法。其中转换之后的第一个字符串,实际上是将原有字符串中 “$START$” 和 “$END$” 替换为 “” (空字符串);

    2024年02月07日
    浏览(57)
  • C++基础容器 -- C的数组和字符串和C++的数组和字符串

    数组 概念 代表内存里一组连续的同类型存储区 可以用来把多个存储区合并成一个整体 数组声明 int arr[10]; 类型名称int表述数组里面所有元素的类型 名称arr是数组的名称 整数10表示数组里面的元素个数 数组里元素个数不可以改变 使用 每个元素都有下标,通过下标可以直接访

    2024年02月06日
    浏览(61)
  • c++读取字符串字符时出错

    这是我做的一个c++爬虫程序但是在抓取网页的时候string类型传递出现了问题 以下是图片代码  url的值是 \\\"http://desk.zol.com.cn/\\\" 我不知道为什么数据传递会出问题 请大佬指教 后面重新启动一遍编译器查一查断点有突然没问题了 ,真是个玄学的问题。我还以为是mallco出问题了

    2024年02月12日
    浏览(63)
  • c++ 字符串去除指定的字符

    使用 std::string 的 erase 和 find 方法 循环查找并擦除特定字符,逐个字符地搜索并移除字符 使用 std::remove 算法和 erase std::remove 函数可以用来移除指定的字符,并返回一个新的“逻辑”结束位置。实际的字符串内容没有改变,但所有需要保留的字符已经被移动到字符串的开始位

    2024年03月17日
    浏览(49)
  • 【数据结构-字符串 三】【栈的应用】字符串解码

    废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【字符串转换】,使用【字符串】这个基本的数据结构来实现,这个高频题的站点是: CodeTop ,筛选条件为: 目标公司+最近一年+出现频率排序 ,由高到低的去 牛客TOP101 去找,只有两个

    2024年02月07日
    浏览(80)
  • 【string题解 C++】字符串相乘 | 翻转字符串III:翻转单词

    目录 字符串相乘 题面 错误记录 Way1 拆分成“先乘后加” 思路 实现 时空复杂度分析 反思 Way2 用数组 思路 实现 时空复杂度分析 翻转字符串III:翻转字符串中的单词 题面 错误记录 思路1 遍历找单词 实现 思路2 暴力解法 实现 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平

    2024年02月07日
    浏览(59)
  • C++篇——在linux下将字节转16进制字符串, 16进制字符串转2进制字符串

    方法1:  方法2:  方法3:

    2024年01月20日
    浏览(54)
  • 算法---哈希及其在字符串中的应用(字符串hash)

              \\\" 加密是信息时代的锁,密码是钥匙 。\\\" - 斯科特·莱普斯基(Scott Adams)         当今,为了信息的存储安全,密码学兴起,哈希(hash)算法也由此应运而生,哈希算法是一种加密算法,是将一个数据转换为一个标志,这个标志和源数据有十分紧密的关系。哈希 算法

    2024年02月22日
    浏览(42)
  • C++ 整型转16进制字符串或16进制字符串转整型

    前言: 整数转16进制字符串,网上大部分的资料都是要传入16进制字符串的位数,有点麻烦。本文介绍的方法自动确定返回的字符串的位数,最终返回位数为偶数位。偶数位方便使用时转成字节数组(unsigned char[]),这样就可以传输了。 一、大/小端形式的16进制字符串转整型 二

    2024年02月14日
    浏览(43)
  • C++字符串详解

    C++ 大大增强了对字符串的支持,除了可以使用C风格的字符串,还可以使用内置的 string 类。string 类处理起字符串来会方便很多,完全可以代替C语言中的字符数组或字符串指针。 string 是 C++ 中常用的一个类,它非常重要,我们有必要在此单独讲解一下。 使用 string 类需要包含

    2024年02月11日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包