字符与字符串初步
字符
声明一个字符变量
类似于 int
, 我们有 char
类型来声明一个字符变量。在赋值时使用单引号包裹字符。例如:char c='+';
字符的输入输出与 int
类似。值得一提的是,在 cin
和 cout
中,不同类型的变量是可以一次性输入,输出的。例如:
int a;
char c;
cin>>a>>c;
字符可以是 0~9 的数字,可以是大小写字母,还可以是 + - " / 等等。
整数与字符转换
最通用的信息规范 ASCII 码(美国信息交换标准代码)规定了每个字符对应什么数字。
你可以输出 (int)('c')
来获取字符对应的数字,同样的,我们也可以用数字对应回字符:(char)(67)
。
输出 0~9,a~z,A~Z 的 ASCII 码,看看有什么规律?(推荐选几个连续的字母实操一下)
你发现了,这三块对应的数字各自是连续的。这让我们可以通过对数字的控制来输出我们想要的字符。
比如,我们想输出第12个小写英文字母:
cout<<(char)((int)('a')-1+12);
请你思考一下这样做的正确性,并且练习一下按顺序输出全部大写字母。
另外一提,想要将字符的 ASCII 码和整数相加,可以略去“将字符变为整数”一步不写,编译器会自动转换。例如:(char)('a'-1+15)
。
字符练习题
-
输入一个字符,如果是小写字母,输出对应的大写字母。如果不是,直接输出输入的字符。
-
输入一个整数,一个字符,一个整数,字符可能为 +,-,*,/。输出对应的运算结果。(注意:输入不同的变量时必须用空格或换行分隔)
字符串
我们这里只使用 string。关于 char 来定义数组的办法较为繁琐,略去。
头文件 cstring
你代码的最上面写了一句 #include<iostream>
。
这代表着你引入了 iostream 的功能。
字符串的功能在另一个头文件里:cstring。
你应该在 iostream 的后面再加一行 #include<cstring>
。
字符串的声明
字符串,可以想象成一个字符构成的数组。不过,在定义字符串时可以不用写成数组形式,直接有一个类型:string
。
定义方式类似,字符串赋值时使用双引号包裹内容。
string s="haraki";
输入输出也类似。在这里,我们要讲解一种新的输入办法:读取一整行。
在之前,我们知道输入时会以空格分隔。但是当我们想输入一个带空格的字符串,如果普通输入,就只能读到前半句。
我们使用一句函数来读取一整行:getline(cin,s);
字符串和字符的关系
要获取字符串中的一个字符,与数组类似,使用方括号。注意,第一个字符的下标为 0,从 0 开始。
s[0]
是第一个字符。
字符串长度
字符串有自带的一些功能。我们只会介绍一个,更多的以后再学。
- size 函数:字符串长度
s 是一个字符串,使用s.size()
获取长度。你可以把这一段看做是整数(这个函数的值是一个整数)。
例如,for(int i=0;i<s.size();i++)
遍历了字符串每个字符的下标。
注意,要用小于号,因为从 0 开始。
例题
输入一个算式,输出结果。类似于上面的练习题 2,但是输入时不加空格。
这意味着我们要做三件事:
- 找到运算符的位置
- 对运算符之前,之后的部分转换为数字
- 判断运算符类型,计算结果
第一点很好做:循环一遍字符串里的每个字符,判断即可。
第二点怎么办呢?
我们可以定义一个数 a=0。
对一个字符串表示了数字,我们从第一位开始:先让 a 乘以 10,再让 a 加上这一位数字。(应该加上这一位字符减去 '0',实现字符与数字的转化),然后进行下一位的分析。
如此,便可提取出数字。如果不理解,可以看下下图。
第三点也很简单。
练习题
- 实现上面的例题。
- 输入一行英文,修正格式:每段话最开始(用句号结束一句话)要大写,其他都改成小写,除了单独的 I。
- 输入一个字符串,输出出现次数最多的一个或几个字符。