C++中的字符串有三种形式
(1)用括号括起来的字符串常量,如"CHINA".
(2)存放于字符数组中,以’\0’字符结尾(ASCII码为0).
(3)string对象,string是C++标准模板库里的一个类,专门用来处理字符串.
9.1 字符串常量
1)字符串常量战绩内存字节数等于字符串数目加1,多出来的是结尾字符’\0’.
2)字符串"C program"在内存中的布局如下:
3)字符串的长度不包含’\0’.
4)"“也是合法的,叫做空串,空船也会占据一个字节的’\0’的内存空间.
5)如果字符串常量中包括双引号,应写成’”’。而’‘字符在字符串中出现必须写两次,变成’\’.
例如:
cout <<"He said: '\"' I am a stu\\dent.'\"'" << endl;
输出:He said: " I am a stu\dent."
9.2 一维char数组存放字符串
1)包含’\0’字符的一维char数组就是一个字符串,其存放的字符串为’\0’前面的字符组成的字符串.
2)用char数组存放字符串,数组元素个数至少为字符串长度加1.
3)char数组的内容,可以在初始化时设定,也可以用C++的函数进行修改,还可以对数组元素赋值的办法改变某个字符.
4)字符数组同样可以用cout、printf输出,用cin,scanf输入,用cin、scanf将字符串数组读入字符数组时,会自动在末尾加一个’\0’.
字符串程序示例:
#include <iostream>
#include <cstring> //包含字符串库函数声明
using namespace std;
int main()
{
char title[] = "Prison Break"; //title 的租后一个元素为'\0'
char hero[100] = "Michael Scofield";
char prisonName[100];
char response[100];
cout << "What's the name of the prison in " << title <<endl;
cin >> prisonName; //输入字符串
if ( strcmp( prisonName, "Fox-River") == 0) //字符串比较函数 相同返回0
cout << "Yeah! Do you love " << hero <<endl;
else{
//字符串复制函数
strcpy( response, "It seem you haven't wtched it!\n");
cout << response <<endl;
}
title[0] = 't';
title[3] = 0; //等效于title[3] = '\0';
cout << title <<endl;
return 0;
}
5)如果把某个字符数组中的元素title[3] = 0,就相当于title[3] = ‘\0’,输出的时候到’\0’就结束.
9.3 字符串的输入
1)用scanf可以将字符串读入字符数组.
2)scanf会自动添加结尾的’\0’.
3)scanf读入到空格为止.
char line[100];
scanf("%s", line); //注意不是&line
printf("%s", line);
输入:Fox River
输出:Fox
4)在数组长度不足的情况下,可能会导致数组越界
char line[5];
scanf("%s", line);
5)如果输入12345,就会导致数组越界
6)cin输入字符串的情况scanf相同.
7)输入一行到字符数组
cin.getline(char buf[], int bufSize);
8)读入一行或bufSize-1个字符到buf,末尾自动添加’\0’,回车换行符不会写入buf但会从输入流中去掉.
char line[10];
cin.getline(line, sizeof(line)); //最多读入9个字符到line
cout <<line << endl;
输入:A b m
输出:A b m
9)使用gets(char buf[])函数读入一行自动加’\0’,但可能导致数组越界
char s[10];
while(gets(s)){
cout << s <<endl;
}
9.4 字符串库函数
1)使用字符串库函数应#include< cstring >.
2)字符串函数都是根据’\0’判断字符串结尾.
3)形参为char []类型,实参可以是char数组或者字符串常量.
4)常见的字符串处理函数如下:
5)字符串库函数用法示例:
#include <iostream>
#include <cstring> //包含字符串库函数声明
using namespace std;
void PrintSmall( char s1[], char s2[]){ //输出字典序小的字符串
if ( strcmp( s1, s2 ) <= 0 ) //如果s1小于等于s2
cout << s1 <<endl;
else
cout << s2 <<endl;
}
int main()
{
char s1[30], s2[40], s3[100];
strcpy( s1, "Hello"); //相当于s1 = "Hello";
strcpy( s2, s1 );
cout << "1. " << s2 <<endl;
strcat( s1, " world!"); //把"world" 添加到"Hello"后面
cout << "2. " << s1 <<endl;
cout << "3. " ; PrintSmall("abc", s2 );
cout << "4. " ; PrintSmall("abc", "aaa");
int n = strlen( s2 ); //计算长度不算'\0'
cout << "5. " << n << "," << strlen( "abc" ) << endl;
return 0;
}
输出:
1. Hello
2. Hello world!
3. Hello
4. aaa
5. 5,3
6)strlen的糟糕用法
char s[100] = "test";
for (int i = 0; i < strlen(s); i ++){
.....
}
7)strlen每次执行都需要时间,时间与字符串长度成正比,这是很大浪费.
8)strlen的正确用法:
char s[100] = "test";
int len = strlen(s);
for (int i = 0; i < len; i ++){
.....
}