字符串
字符串的定义
字符串是由零个或多个字符组成的有限序列,每个字符都用一个唯一的ASCII码表示。
字符串的常用操作
- 字符串的长度:
strlen(s)
函数可以获取字符串s的长度。 - 字符串的拼接:
strcat(s1, s2)
函数可以将字符串s2拼接到字符串s1的尾部。 - 字符串的比较:
strcmp(s1, s2)
函数可以比较字符串s1和s2的大小,如果s1<s2则返回-1,如果s1>s2则返回1,如果s1=s2则返回0。 - 字符串的复制:
strcpy(s1, s2)
函数可以将字符串s2复制到字符串s1。 - 字符串的查找:
strchr(s, c)
函数可以查找字符串s中第一个出现字符c的位置,如果没有找到则返回NULL。 - 字符串的替换:
strstr(s1, s2)
函数可以查找字符串s1中第一次出现字符串s2的位置,并将其替换为另一个字符串。
字符串的输入输出
- 字符串的输入:
scanf("%s", s)
函数可以从标准输入中读取一个字符串。 - 字符串的输出:
printf("%s", s)
函数可以将字符串s输出到标准输出。
字符串的内存管理
- 字符串的动态分配:
char *s = new char[n+1];
语句可以动态分配n+1个字符的内存,并返回一个指向该内存的指针。 - 字符串的释放:
delete[] s;
语句可以释放由new
分配的内存。
定义和初始化
string s1; //默认初始化,s1为空字符串
string s2 = s1; //s2是s1的副本
string s3 = "hello"; //s3是字符串"hello"的副本
string s4(10, 'a'); //s4是10个字符'a'组成的字符串
字符串的操作
string s1,s2;
//1.输入
cin >> s1 ; //读取一行字符串,包括空格
getline(cin,s1); //读取一行字符串,包括换行符
cin.getline(s2,1000); //读取一行字符串,最多读取1000个字符
//2.输出
cout << s1 << endl;
printf("%s\n", s1.c_str()); //调用了c_str()函数,将string转换为char*类型,不能用printf直接输出string
puts(s1.c_str()); //调用了c_str()函数,将string转换为char*类型
//3.判断是否为空及长度
string s3 = "hello",s2;
cout << s3.empty() << endl; //输出0
cout << s2.empty() << endl; //输出1
cout << s3.size() << endl; //输出5,和s.length()相同
//4.拼接
string s4 = s1 + s2;//6种运算符都适用
//5.遍历
for(int i=0;i<s1.size();i++)
{
cout << s1[i];
}
for(char c : s1) //c++11新特性,遍历string,基于范围for循环
{
cout << c;
}
//修改值
//char可以改为auto,自动推导类型
for(char &c : s1) //c++11新特性,遍历string,基于引用for循环
{
c = 'x';//修改字符串,输出结果为xxxxxxx
}
例题
信息加密(——凯撒密码)
凯撒密码是一种简单的替换加密技术,其中字母表中的每个字母在加密时都被替换为固定数目的位置之后(或之前)的字母。
题目描述
在传输信息的过程中,为了保证信息的安全,我们需要对原信息进行加密处理,形成加密信息,从而使得信息内容不会被监听者窃取。
现在给定一个字符串,对其进行加密处理。
加密的规则如下:
1.字符串中的小写字母,a加密为 b,b加密为 c,…,y加密为 z,z加密为 a。
2.字符串中的大写字母,A加密为 B,B加密为 C,…,Y加密为 Z,Z加密为 A。
3.字符串中的其他字符,不作处理。
请你输出加密后的字符串
输入格式
输入只有一行,包含一个字符串,注意字符串中可能包含空格。
输出格式
输出加密后的字符串。
数据范围
输入字符串的长度不超过 100
输入样例
Hello! How are you!
输出样例
Ifmmp! Guvf vf!
解题思路
if(c >= 'a' && c <= 'z') c = (c - 'a' + 1) % 26 + 'a';
- c >= ‘a’ && c <= ‘z’:这个条件检查字符c是否是一个小写字母。
- c - ‘a’:将小写字母c转换为从0开始的索引(即’a’变为0,'b’变为1,依此类推)。
- (+ 1):将索引增加1,以实现凯撒密码的“向后移动一个位置”的效果。
- (% 26):取模操作确保如果字母是’z’(索引为25),它会被转换回’a’(索引为0)。这是因为英文字母表有26个字母,所以使用26作为模数。
- (+ ‘a’):将计算出的索引转换回对应的小写字母字符。
完整代码
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
string s;
getline(cin, s);
for(auto &c : s)
{
if(c >= 'a' && c <= 'z') c = (c - 'a' + 1) % 26 + 'a'; //先求出偏移量,再加上a
if(c >= 'A' && c <= 'Z') c = (c - 'A' + 1) % 26 + 'A';
}
cout << s << endl;
return 0;
}