1.定义单个字符
char a;
a = 'x';
char b = 'x';
char c = 120;
cout<<a<<' '<<b<<' '<<c<<endl;
//x x x
cout<<(int)a<<' '<<(int)b<<' '<<(int)c<<endl;
//120 120 120
注意:char类型只能存储单个字符;C++允许char和int类型互换,将字符转换为int类型会返回该字符的ASCII值。
注意: 在ASCII码表中,前32个字符是不可见字符,后96个是可见字符。
2.输入输出
输入:
cin>>a;
scanf("%c",&a);
a = getchar();
上面三个方法等价。
输出:
cout<<a;
printf("%c",a);
putchar(a);
上面三个方法等价。
3.字符数组
定义:
char a[5] = {'y','e','s','!'};
//or
char a[5] = "yes!";
只有在赋初值的时候才能这样写。
位数不足自动补'\0'(空字符)
4.字符数组的输入输出
输入:
cin>>a;
scanf("%s",c);//注意使用scanf输入时不加&(取地址符)
gets(a);
注意:使用scanf输入时不加&(取地址符),输入会在遇到空格或者换行时结束,并在末尾加上'\0'
输入带空格的字符数组:
cin.getline(a,sizeof(a));
注 :读取一整行,忽略末尾换行符'\n',并在末尾加上一个空字符。
cin.getline中必须设置读取字符上限,实际读取到的字符 = 上限-1
sizeof可以获取变量或数组的总字节数,对字符数组使用就相当于声明时的数组大小。
输出:
cout<<a;
printf("%s",a);
puts(a);
注意:输出在遇到'\0'结束,但puts()会多输出一个换行符。
7.更多操作
(1)求有效长度
strlen(a);
//例:
char a[20];
cin.getline(a,sizeof(a));//Hello world!
cout<<strlen(a);//12
作用:找第一个空字符的位置。
时间开销:与计算结果成正比。
千万不要这么写!!!
//千万不要这么写!!!
for(int i = 0; i <= strlen(a); i++){
//代码
}
//每次循环都要strlen(a),很慢。
//可以这样优化
int l = strlen(a);
for(int i = 0; i <= l; i++){
//代码
}
(2)链接两个字符数组
strcat(c1,c2);
//例
char c1[20] = "Yes!",c2[10] = "hello!";
strcat(c1,c2);
cout<<c1;//Yes!hello!
cout<<c2;//hello!
作用:在c1中找到首个'\0',将c2全部复制在后面,然后加上一个'\0'。(c2不变)
strncat(c1,c2,n);
//例
char c1[20] = "Yes!",c2[10] = "hello!";
strncat(c1,c2,3);
cout<<c1<<endl;//Yes!hel
cout<<c2;//hello!
作用同上,但限制了长度。
(3)比字典序
strcmp(c1,c2);
如果c1小返回-1,如果c2小返回1,一样返回0;
直到比出结果或遇到空字符。
strncmp(c1,c2,n);
作用同上,但限制了比较长度。
(4)复制
strcpy(c1,c2);
//例
char c1[20] = "abcdef";
char c2[10] = "xyz";
strcpy(c1,c2);
cout<<c1;//此时c1的值为"xyz\0ef",但打印到\0时会停止,所以只会打印"xyz"
作用:把c2的值复制在c1开头遇到\0结束,但会把c2末尾的\0复制过来
strncpy(c1,c2,n);
char c1[20] = "abcdef";
char c2[10] = "xyz";
strncpy(c1,c2,2);
cout<<c1;//xycdef
作用:限制长度复制,遇到\0结束