字符类型是一个有序类型,字符的大小顺序按照ASCⅡ代码表。
可以利用字符变量当作循环变量,能够使程序处理更直观。
字符数组的赋值
1. 用字符初始化数组:初始值表赋值(从首元素开始赋值,没有初值的默认为空字符)
char str[6]={'C','h','i','n','a','\0'}; //表示数组str中存放着字符串China
注意:字符串是一维数组,但一维字符数组不等于字符串。此外,字符串的结尾有一个结束符('\0') ,所以字符串常量"a"占两个字节。
2. 用字符串初始化数组
char c[3][6]={"I","love","China"};
注意:字符串的长度要小于字符数组的大小
字符串的输入输出
1. 输入
gets(字符串名称):从光标开始,遇到换行符停止,即读取一整行。
scanf("%s", 字符串名称):从光标开始,遇到空格停止。
2. 输出
puts(字符串名称):输出一个字符串和一个换行符。
printf("%s", 字符串名称):输出字符串(可以一次性输出多个字符串)。
补充:
1. getchar():读入下一个字符(空格也会读入)。
2. 以下语句可实现循环读入数据,在读不到的时候停止循环。
char st[200];
while(scanf("%s",&st)==1) {}
字符串常用处理函数
strcat(字符串1,字符串2):将串2连接到串1的后边,返回新串1
strncat(字符串1,字符串2,长度n):将串2的前n个字符连接到串1的后边,返回新串1
strcpy(字符串1,字符串2):将串2复制到串1,返回新串1
strncpy(字符串1,字符串2,长度n):同上
strcmp(字符串1,字符串2):比较串1和串2的大小,若1>2返回正整数,若1=2返回0,若1<2返回负整数
strncmp(字符串1,字符串2,长度n):同上
strstr(字符串1,字符串2):判断串2是否是串1的字串,若是则返回串2在串1中首次出现的地址,否则返回NULL
strlen(字符串):计算长度,结束符不算在长度内
strlwr(字符串):将大写字母换成小写字母
strupr(字符串):将小写字母换成大写字母
【例1. 字符串移位包含问题】
第一个想法是用循环模拟移位,因为是字串所以只需将母串接尾一次就能够化圈为直线。
但是函数积累量够多,就会想到strstr()这个函数,可以不用模拟而直接判断是否是字串了。
(以下代码被注释掉的部分就是方法一的模拟)
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char a[31],b[31],tmp[31];
/*bool judge(int x) {
int now=1;
for(int i=x+1;i<strlen(a);i++) {
if(a[i]!=b[now]) return false;
now++;
if(now==strlen(b)) return true;
}
}*/
int main() {
scanf("%s%s",&a,&b);
if(strlen(a)<strlen(b)) swap(a,b); //确定a是母串,b是待检验的子串
strcat(tmp,a);
strcat(a,tmp); //将母串接尾一次
/* int flag=0;
for(int i=0;i<strlen(a);i++) {
if(b[0]==a[i]) {
if(judge(i)==true) {
cout<<"true";
flag=1;
exit(0);
}
}
}
if(flag==0) cout<<"false";
*/
if(strstr(a,b)==NULL) cout<<"false";
else cout<<"true";
return 0;
}