C++字符串详解

个人主页:[PingdiGuo_guo]

收录专栏:[C++干货专栏]

各位观众们大家好,今天我们来学习一下什么是字符串。

目录

1.什么是字符串

2.字符串的用途

3.字符串的定义

4.如何给字符串赋值

1.输入赋值

2.直接赋值

5.字符串的输出

6.字符串的插入

7.如何计算字符串的长度

8.注意事项

9.字符串的遍历

1. 使用下标访问字符

2. 使用迭代器遍历字符

10.练习题目

11.总结


1.什么是字符串

字符串在计算机科学中,是一种重要的数据结构,它是由零个或多个字符组成的有限序列。字符可以是任何字符集中的元素,比如ASCII字符集、Unicode字符集等,它们可以是字母、数字、标点符号、空白字符以及其他可打印或不可打印的符号。
在C/C++中,字符串通常被表示为一个字符数组,数组的最后一个元素是一个特殊的终止字符 \0,用来标记字符串的结束。在C++中,字符串的输入和输出可以通过标准输入输出流(iostream)库中的std::cin和std::cout进行操作。

2.字符串的用途

1. 文本处理:
- 文本搜索:在一段文本中查找特定的单词或短语。
 

std::string text = "This is a sample text.";
std::string keyword = "sample";
if (text.find(keyword) != std::string::npos) {
std::cout << "Keyword found in the text.\n";
}



- 文本替换:替换文本中指定的字符串为另一个字符串
 

text.replace(text.find(keyword), keyword.length(), "example");




2. 文件名和路径操作:
- 分割文件路径:通过字符串分割函数(如 std::filesystem::path::parent_path 或 std::string::find_last_of)获取目录名和文件名。

- 构造URLs:字符串可以用来拼接网址或查询字符串。

3. 姓名、地址等个人信息处理:
- 姓名拼接:将姓氏和名字连接起来,或者反过来拆分。

4. 密码验证:
- 判断用户输入的密码是否符合特定的复杂性要求(如长度、特殊字符、数字等)。

5. JSON/XML解析:
- 使用字符串处理库解析JSON或XML文档,从中提取关键信息。

6.正则表达式匹配:
- 使用字符串和正则表达式库(如C++11的std::regex)来验证输入是否符合某种模式,例如邮箱地址、电话号码等。

3.字符串的定义

首先,我们需要头文件:

#include<string>

其次,我们还需要在main函数里定义一个字符串:

int main()
{
    std::string a;
}

上述代码定义了一个字符串类型的变量a,它可以用来储存字符串。

4.如何给字符串赋值

要想给字符串变量赋值,有两种方法:

1.输入赋值

输入赋值就是直接从键盘给字符串变量输入值,我们可以用getline函数来进行输入:

​
std::getline(std::cin, a); // 注意使用getline处理带有空格的字符串输入
​

​

getline函数可以处理带空格的字符串输入,比如,我们输入“123 456”,那输出的时候,因为用了getline函数,变量就会把空格和空格后面的也看成一个整体,输出的也是“123 456”。

当然,也可以用cin或scanf直接输入:

std::cin>>a;

cin直接输入会把空格看做分割线,从而只读取空格前的内容,比如,我们输入“123 456”,它输出的则是“123”

2.直接赋值

直接赋值就是直接在代码里给字符串变量赋值,它通常用来做密码核对:

a="123456";

注意:

在赋值时,一定要用双引号,因为双引号里的是字符串,而单引号里的则是字符,千万不要搞错!!

5.字符串的输出

字符串的输出可以直接用cout或printf输出:

// 输出读取到的字符串
    std::cout << "您输入的字符串是: " <<a << std::endl;

比如,输入了“123456”的话,输出的也是“123456”,同上。

6.字符串的插入

在C++中,可以使用insert()函数来实现字符串的插入操作。下面是一个示例:
 

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, World!";
    std::string insertion = "beautiful ";

    str.insert(7, insertion);

    std::cout << str << std::endl;

    return 0;
}

在上面的示例中,我们首先定义了一个字符串str,其值为"Hello, World!"。然后,我们定义了一个要插入的字符串insertion,其值为"beautiful "。接下来,我们使用insert()函数将insertion插入到str的第7个位置上。

最后,我们输出被修改后的字符串str,将会得到"Hello, beautiful World!"作为输出。

当然,std::string 还提供了其他形式的插入方法,例如:
 

// 在字符串末尾插入字符或字符串
originalStr += ", How are you?";
// 使用push_back()在字符串末尾插入单个字符
originalStr.push_back('?');

以上两种方法会在原始字符串后面追加内容,得到 "Hello, World!, How are you?" 和 "Hello, World!, How are you?"(最后多了个问号)

7.如何计算字符串的长度

要想计算字符串的长度,我们可以用一个变量len来储存,用.size()函数来计算字符串的长度

std::string a="123456";
std::int len=a.size();

这样,变量len里储存的就是字符串a的长度了。

8.注意事项

1. std::getline 用于读取一行文本,包括空格在内的所有字符,直到遇到换行符。如果只想读取一个单词(不含空格),可以使用 std::cin >> inputString;。

2. 缓冲区问题:当混合使用 >>和 std::getline 读取标准输入时,需要注意清除\n(换行符)残留。这是因为>>读取完一个单词后,不会消耗掉换行符,所以紧接着的 std::getline会立即结束,导致无法正常读取。解决办法是在 >> 后调用 std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 来清空缓冲区。

3. 错误处理:在实际编程中,应对输入进行有效性检查,例如确保成功读取到了字符串,避免因为输入错误导致的程序异常。

4. 内存管理:std::string 类自动管理其内部的内存,所以在输入较大字符串时,不必担心溢出问题但对于C风格字符串(字符数组),需要预先指定足够大的数组大小来存储输入的字符串,否则可能导致缓冲区溢出。

9.字符串的遍历

在C++中,字符串是由字符组成的字符数组,可以通过下标访问单个字符,也可以使用迭代器进行遍历。

1. 使用下标访问字符

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, World!";
    for (int i = 0; i < str.length(); i++) {
        std::cout << str[i] << " ";
    }
    std::cout << std::endl;
    return 0;
}


在上述代码中,我们使用下标 i 来遍历字符串 str 的所有字符。通过 str.length() 可以获取字符串的长度,在循环中使用 str[i]来访问字符串中的每个字符。

2. 使用迭代器遍历字符

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, World!";
    for (std::string::iterator it = str.begin(); it != str.end(); it++) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;
    return 0;
}


在上述代码中,我们使用迭代器 it 来遍历字符串 str的所有字符。通过 str.begin() 获取字符串的起始迭代器,str.end() 获取字符串的结束迭代器。在循环中使用*it 来访问迭代器指向的字符。

无论是使用下标访问字符还是使用迭代器遍历字符,都可以用来遍历字符串的每个字符。选择哪种方法取决于个人偏好和具体的需求。

10.练习题目

WOTOJO

时间限制: 1.000 Sec  内存限制: 128 MB

题目描述

子序列:是指在序列中选择某些元素,按照序列中的顺序连接在一起形成的。比如 wtj、wj、wot、wto 都是 wotojo 的子序列。但 owt 这个序列不是。我们定义子序列长度为子序列中包含的元素数量,比如 wtj 的长度为 3,wj 的长度为 2。如果没有特殊说明,空序列和整个序列都是原序列的一个子序列。我们一般会用非空子序列来排除空序列,用真子序列来排除整个序列,用非空真子序列来同时排除两个。
子串:是指在序列中选择连续的某些元素,按照序列中的顺序连接在一起形成的,所以子串也常被称作连续子序列。比如 wot、oto 都是 wotojo 的子串。但 wtj 不是。与子序列相同,子串包含的元素个数也被称为子串的长度,同时也有“非空”、“真”等描述方法。
现在PingdiGuo_guo得到了一个仅包含英文小写字母的字符串 s,PingdiGuo_guo想要在其中找到一个子串 t,使得 wotojo 是 t 的子序列。显然有可能有多个这样的 t,PingdiGuo_guo想要一个知道最短的 t 的长度是多少。
比如:当 s 为 wwowoxtoyjotojo 时,子串 wowoxtoyjo、woxtoyjotojo、woxtoyjo 等都包含子序列 wotojo。其中最短的是 woxtoyjo,长度为 8。 

输入

输入一行,即字符串 s。

输出

一行一个整数,表示 t 最小长度。

样例输入 

wwowoxtoyjotojo

样例输出 

8

提示

【数据范围】
对于30%的数据:保证 |s|≤ 20
对于另外30%的数据:保证 s 中 w、t、j 三个字符都只出现一次,o 只出现了三次。换言之,s 中仅有一个子序列是 wotojo。
对于 100% 的数据,保证:s 中仅包含小写英文字母且包含子序列 wotojo,1≤ |s|≤ 1000。其中 |s| 表示字符串 s 的长度。

解决代码:

#include <bits/stdc++.h>
#define MX 1000
using namespace std;
int a[MX+10];
int main() 
{
    string s,t;
    int j,i,st=0,g=0;
    cin>>s;
    for(i=1;i<=s.size();i++)
    {
    	if(s[i]=='w')
    	{
    		st=1;
    		g++;
    		for(j=i;j<=s.size();j++)
    		{
    			if(st==1&&s[j]=='o')
    			{
    				st=2;
				}
				else if(st==2&&s[j]=='t')
				{
					st=3;
				}
				else if(st==3&&s[j]=='o')
				{
					st=4;
				}
				else if(st==4&&s[j]=='j')
				{
					st=5;
				}
				else if(st==5&&s[j]=='o')
				{
					st=6;
					break;
				}
				g++;
			}
		}
		if(st==6)
		{
			a[i]=g;
	    }
	    st=g=0;
	}
	sort(a+1,a+s.size()+1);
	for(i=1;i<=s.size();i++)
	{
		if(a[i]>0)
		{
			cout<<a[i]<<endl;
			break;
		}
    }
    return 0;
}

11.总结

本篇博客到这里就结束了,感谢大家的观看与支持,如果有好的建议请多留言!!

  • 26
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值