个人主页:[PingdiGuo_guo]
收录专栏:[C++干货专栏]
各位观众们大家好,今天我们来学习一下什么是字符串。
目录
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.总结
本篇博客到这里就结束了,感谢大家的观看与支持,如果有好的建议请多留言!!