● 用双引号括起来的字符串常量,如"CHINA",“C++ program”
● 存放于字符数组中,以‘\0’字符(ASCII码为0)结尾
● string对象。string是C++标准模板库里的一个类,专门用于处理字符串。
● 字符串常量占据内存的字节数等于字符串中字符数目加1, 多出来的是结尾字符‘\0’。
字符串 “C program” 在内存中的布局:
● 字符串的长度不包含’\0’
● “” 也是合法的字符串常量,称为“空串”, 空串仍然会占据一个字节的存储空间,存放 ‘\0’。
● 如果字符串常量中包含双引号,则双引号应写为‘"’。而‘\’字符在字符串中出现时,须连写两次,变成‘\’。例如:
cout << "He said: \"I am a stu\\dent.\"";
=> He said: "I am a stu\dent."
● 包含‘\0’字符的一维char数组,就是一个字符串。其中存放的字符串 即为 ‘\0’前面的字符组成。
● 用char数组存放字符串,数组元素个数应该至少为字符串长度+1
● char数组的内容,可以在初始化时设定,也可以用C++库函数进行修改, 还可以用对数组元素赋值的办法任意改变其中的某个字符。
● 字符数组同样可以用cout、printf输出,用cin、scanf读入。用cin、 scanf将字符串读入字符数组时,会自动在字符数组中字符串的末尾加上 ‘\0’
● 用scanf可以将字符串读入字符数组
● scanf会自动添加结尾的’\0’
● scanf会自动添加结尾的’\0’
char line[100];
scanf("%s",line); //注意,不是 &line
printf("%s",line);
Fox River↙
Fox
● 在数组长度不足的情况下,scanf可能导致数组越界
char line[5];
scanf("%s",line);
若输入"12345",则数组越界!
● cin输入字符串的情况和scanf相同
● cin.getline(char buf[], int bufSize);
读入一行(行长度不超过bufSize-1)或bufSize-1个字符到buf, 自动添加’\0’ 回车换行符不会写入buf,但是会从输入流中去掉
char line[10];
cin.getline(line, sizeof(line));
//或 cin.getline(line,10); 读入最多9个字符到 line
cout << line;
A b c↙
A b c
● 使用字符串函数需要 #include
● 字符串函数都根据’\0’来判断字符串结尾
● 形参为char []类型,则实参可以是char数组或字符串常量
● 字符串拷贝 strcpy(char dest [],char src [] ); //拷贝src到dest
● 字符串比较大小 int strcmp(char s1 [],char s2 []); //返回0则相等
● 求字符串长度 int strlen(char s[]);
● 字符串拼接 strcat(char s1[],char s2[]); //s2拼接到s1后面
● 字符串转成大写 strupr(char s[]); 字符串转成小写 strlwr(char s[]);
char s[100]="test";
for( int i = 0; i < strlen(s); ++ i ) {
s[i] = s[i]+1;
}
● strlen函数的执行是需要时间的,且时间和字符串的长度成正比
● 每次循环,都调用strlen函数,这是效率上的很大浪费
应取出s的长度存放在一个变量里面,然后在循环的时候使用该变量
char s[100] = "test";
int len = strlen(s);
for( int i = 0; i < len; ++ i ) {
s[i] = s[i]+1;
}
或
char s[100] = "test";
for( int i = 0; s[i]; ++ i ) {
s[i] = s[i]+1;
}