字符

字符(char)在计算机中实际存储的是字符的ASCII码值。字符常量用单引号表示,如’0’、‘A’、‘a’,对应的ASCII码值分别为48、65、97(详见下表)。
(0)字符与字符串的区别:
字符常量(单引号):'a'
字符串常量(双引号):"a" "Hello World!\n" "\nyczx\tyzoi\n"
有一些字符(转义字符)表示时以反斜线开头。如换行'\n'、回车'\r'、空字符'\0'、制表符'\t'等。
(1)语法上可以将字符当作int型使用,例如'a'-'A'-'0结果是97-65-48=-16
(2)整数型转char型要强行转换,例如char('0'+5)结果是字符'5'
(3)任意类型间转换可用字符串流,例如:

#include <bits/stdc++.h>
using namespace std;
int main(){
	stringstream  temp;//stringstream需书写头文件<sstream>
	temp<<"123456";
	temp<<"123";
	int x;
	temp>>x;
	cout<<temp<<endl<<temp.str()<<endl<<x;
	return 0;
}

结果如下
stringstream

(4)string类可直接按字典序比较大小,例如“abc”>=“abd”结果为false。
(5)C风格的字符数组可直接赋值给string类型,例如char a[]="yczxOI"; string s=a;
ASCII码表

字符数组

字符数组中的每一个元素都是一个字符(实质存储为该字符对应的ASCII码值),将这些单个字符存储下来便成了一串数组。

定义:

char 数组名[常量表达式],如:

char s1[5];
//数组s1是一个具有5个字符元素的一维字符数组
char s2[3][5];
//数组s2是一个具有15个元素的二维字符数组

赋值:

(1)用字符初始化赋值,如:

char s1[3]={'C','+','+'};
//初始表中的每个数据项是一个字符,用字符给数组s1的各个元素初始化

字符数组中若存放字符串,末尾有结束符(‘\0’),如:

char s2[4]={'C','+','+','\0'};

(2)用字符串初始化赋值,如:

char s3[4]="C++";
//注意空字符'\0'会自动添加到末尾,字符数组的大小是字符串的长度加1

同理,二维字符数组的初始化可以用若干个字符串组成的初始值来完成,如:

char s4[3][4]={"abc","def","ghi"};
//数组s4中最多可存放3个长度不大于3的字符串

数组s4的实际存储情况:

a b c \0
d e f \0
g h i \0

(3)数组元素的赋值,如:

char s[3];
s[0]='a';s[1]='b';s[2]='c';//与整型数组赋值类似

字符串

(1)C++字符串的读入与输出
声明字符串: string s;
读入字符串: cin>>s;
输出字符串: cout<<s;
注意:用cin读入字符串时,空格和换行符都被认为是字符串的结束,因此输入的内容中间不能有空格;空格开头的字符串读入时会忽略开头的空格。

(2)读入整行字符串
用法:getline(cin,s);
功能:读入一个字符串s,读到换行符或EOF(文件结束标志)就结束。
特点:可以读入一行中包含空格、制表符等空白字符的字符串。

(3)字符串函数
求字符串长度函数size
用法:string s=“abc”; cout<<s.size();
功能:结果为3,返回s字符串的长度。

在字符串后添加字符函数push_back
用法:s.push_back(‘a’);
功能:在字符串s后添加单个字符’a’
注意:无法添加字符串,如s.push_back(“abc”);会报错

(4)字符处理函数
字符处理函数
isalpha(ch):ch是字母返回true,否则false
ispunct(ch):ch是标点符号(除数字、字母或空白字符以外的字符),返回true否则false
isspace(ch):ch是空格字符返回true否则false
isdigit(ch):ch是数字返回true否则false
islower(ch):ch是小写字母返回true否则false
isupper(ch):ch是大写字母返回true否则false

样例研习

过滤多余的空格。一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格。
输入格式::1行,一个字符串(长度不超过200),句子的头和尾都没有空格。
输出格式::过滤之后的句子。
输人样例:
Hello         \space\space\space\space\space\space\space\space         world.This         \space\space\space\space\space\space\space\space        is c     \space\space\space\space\space      language.
输出样例:
Hello world. This is c language.
分析:cin只能一个一个读“单词”,不读空格。现在要解决两个技术:
(1)判断读入结束。
(2)字符串连接。
程序如下:

#include <iostream>
#include <string> 
using namespace std;
int main(){
	string s,temp;
	cin>>s;
	while (cin>>temp)
		s+=' '+temp;
	cout<<s<<endl;
	return 0;
}

说明:
(1)while(cin >> temp)的功能是循环读入数据,在读不到的时候停止循环。用户可通过ctrl z来终止读入。
(2)s+=' '+temp;是在s的后面加一个空格和字符串变量 temp,是一种字符串连接的简便方式。
(3)两个字符串常量是不能直接用加号连接的(加号两边需有一个字符串变量,如上述样例),例如:
string s =“abc" + “def";是错误的。
可以改成:
string s =“abc" “def”;或将其中一项放入字符串变量中。
(4)字符常量用单引号括起来(比如:'a'),字符串常量要用双引号(比如:“abc123")。即使一个字符的字符串也不是字符类型,例如:‘A’=="A"是错误的表达式。
(5)多次在字符串后面追加内容时,用成员函数append是个不错的选择。例如:

#include <iostream>
#include <string> 
using namespace std;
int main(){
	string s1,s2,temp;
	s1="111";
	s2="222";
	s1.append("s2=").append(s2).append("#end\n");
	cout<<s1<<endl<<s2<<endl;
	return 0;
}

输出结果为:
在这里插入图片描述

例1:输入包含数字、字母的字符串,输出字母

样例输入:124YC724zx
样例输出:YCzx

方法一:
int main(){
	string s;
	cin>>s;
	for(int i=0;i<s.size();i++)
		if(isalpha(s[i])) cout<<s[i];
	cout<<endl;
	return 0;
}

方法二:
int main(){
	string s,s1;
	cin>>s;
	for(int i=0;i<s.size();i++)
		if(isalpha(s[i])) s1.push_back(s[i]);
	cout<<s1<<endl;
	return 0;
}

例2:输入一行字符,统计其中空白字符与数字字符的个数
样例输入:Jiangsu Yancheng Middle School is set up at 1927.
样例输出:8 4

int main(){
	string s;
	getline(cin,s);
	int ans1=0,ans2=0;
	for(int i=0;i<s.size();i++){
		if(isspace(s[i])) ans1++;
		if(isdigit(s[i])) ans2++;	
	}
	cout<<ans1<<" "<<ans2<<endl;
	return 0;
}

例3:回文
一串字符如果从左读与从右读完全相同,则称之为回文。输入一串字符(不超过100位),是否为回文。是输出Yes,否则输出No。
样例输入:ABA
样例输出:Yes

int main(){
	string s;
	cin>>s;
	int i=0,j=s.size()-1;
	bool f=true;
	while(i<j)
		if(s[i]==s[j]){
			i++;j--;
		}
		else{
			f=false;break;
		}
	if(f) cout<<"Yes"<<endl;
	else cout<<"No"<<endl;
	return 0;
}

例4:字符串判等
判断两个由大小写字母和空格组成的字符串在忽略大小写和空格后是否相等。
输入要求:两行,每行包含一个字符串
输出要求:若相等输出Yes,否则输出No。
样例输入:
a A bb BB ccc CCC
Aa BBbb CCC ccc
输出样例:
Yes

int main(){
	string s1,s2,t1,t2;
	getline(cin,s1);
	getline(cin,s2);
	for(int i=0;i<s1.size();i++)
		if(isalpha(s1[i]))
			t1.push_back(tolower(s1[i]));
	for(int i=0;i<s2.size();i++)
		if(isalpha(s2[i]))
			t2.push_back(tolower(s2[i]));
	int f=1;
	if(t1.size()!=t2.size())
		f=0;
	else
		for(int i=0;i<t1.size();i++)
			if(t1[i]!=t2[i]){
				f=0;break;
			}
	if(f)	cout<<"Yes"<<endl;
	else	cout<<"No"<<endl;
	return 0;
}

例5:计算式求和
从键盘输入任意N(1<=n<=10)个整数(1<=整数位数<=5)的加法表达式,计算并输出结果。
样例输入:12+23
样例输出:35
提示:字符串中数字"123"转换为数值可以设一整数s变量为0,通过s=s*10+(s[i]-‘0’)计算式来完成。

int main(){
	string s;
	cin>>s;
	int sum=0,i=0;
	while(i<s.size()){
		if(s[i]=='+')
			i++;
		int p=0;
		while(isdigit(s[i])){
			p=p*10+(s[i]-'0');
			i++;
		}
		sum+=p;
	}
	cout<<sum<<endl;
	return 0;
}

例6:统计字母个数
问题描述:读入一行字符(长度不超过1000),统计里面英文字母a到z出现的次数?(假设所有输入字符都为小写)
输入要求:输入一行字符,可能包含小写字母、空格和其他字符。
输出要求:输出包括一行,包含所有字符个数不为0的字符及其个数,每项之间用空格隔开。
输入样例:our school is very beautiful.
输出样例:a:1 b:1 c:1 e:2 f:1 h:1 i:2 l:2 o:3 r:2 s:2 t:1 u:3 v:1 y:1

int main(){
	int c[27];
	memset(c,0,sizeof(c));
	string s;
	getline(cin,s);
	for(int i=0;i<s.size();i++)
		if(isalpha(s[i]))
			c[s[i]-'a']++;
	for(int i=0;i<26;i++)
		if(c[i]>0){
			cout<<char('a'+i)<<":"<<c[i]<<" ";
		} 
	cout<<endl;
	return 0;
}

例7:找第一个只出现一次的字符
给定一个只包含小写字母的字符串(长度<100000),请你找到第一个仅出现一次的字符。如果没有,输出no。
输入样例:abcabd
输出样例:c

方法一
int main(){
	string s;
	cin>>s;
	bool f=false;
	int ans=-1;
	for(int i=0;i<s.size();i++){
		int cnt=0;
		for(int j=0;j<s.size();j++)
			if(s[i]==s[j]) cnt++;
		if(cnt==1){
			f=true;ans=i;break;
		} 
	}
	if(f) cout<<s[ans]<<endl;
	else cout<<"no"<<endl;
	return 0;
}

方法二
int cnt[28];
int wei[100010];
int main(){
	string s;
	cin>>s;
	for(int i=0;i<s.size();i++){
		cnt[s[i]-'a']++;
		if(cnt[s[i]-'a']==1)
			wei[s[i]-'a']=i;
	}
	int ans=100010;
	for(int i=0;i<26;i++)
		if(cnt[i]==1)
		{if(wei[i]<ans) ans=wei[i];		}
	if(ans!=100010) cout<<s[ans]<<endl;
	else	cout<<"no"<<endl;
	return 0;
}

C++字符串函数

取字符串的子串
用法:s.substr(开始位置,子串长度)

插入字符串
用法:s.insert(插入位置,插入字符串)

删除字符串
用法:s.erase(开始位置,删除字符串长度)

替换字符串
用法:s.replace(开始位置,长度,待替换字符串)

查找子串在字符串中第一次出现的位置(从0开始)
用法:s.find(子串)
若未找到则返回string::npos

查找子串在字符串第x位及之后第一次出现的位置(从0开始)
用法:s.find(子串,x)
若未找到则返回string::npos

例8:选择你喜爱的水果
程序中保存了七种水果的名字,要求输入一个与水果相关的句子。程序在已存储的水果中搜索,以判断句子中是否包含七种水果的名称。如果包含,则用词组"Konjac"替换句子中出现的水果单词,并输出替换后的句子。如果句子中没有出现这些水果的名字,则输出“You must not enjoy fruit.”。假设七种水果的名字为:apples,bananas,peaches,cherries,pears,oranges,strawberries。
输入样例:
I really love peaches on my cereal.
I’d rather have a candy bar.
apples are wonderful with lunch.
样例输出:
I really love Konjac on my cereal.
You must not enjoy fruit.
Konjac are wonderful with lunch.

string fruits[7]="apples","bananas","peaches",
				 "cherries","pears","oranges","strawberries"};
int main(){
	string s;
	while(getline(cin,s)){
		int pos,id=-1;
		for(int i=0;i<7;i++){
			pos=s.find(fruits[i]);
			if(pos!=string::npos)
			{id=i;break;}
		}
		if(id==-1)
			cout<<"You must not enjoy fruit."<<endl;
		else{
			s.replace(pos,fruits[id].size(),"Konjac");
			cout<<s<<endl;
		}
	}
	return 0;
}
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐