字符和字符串的区别
字符
如下,定义char
,每一个字符一般情况下占用8个字节。
char c, ch;
字符串
例如"helloworld";
注意
' '
和" "
的区别,后者为常量字符串
在C++中,有两种类型的字符串表示形式:
- C-风格字符串
- C++引入的string类
C-风格字符串
C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用null
字符'\0'
终止的一维字符数组。因此,一个以null
结尾的字符串,包含了组成字符串的字符。
null
字符对应的ASCII
为0。
下面的声明和初始化创建了一个 “Hello” 字符串。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 “Hello” 的字符数多一个。
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
其实,您不需要把null
字符放在字符串常量的末尾。C++ 编译器会在初始化数组时,自动把'\0'
放在字符串的末尾。所以也可以利用下面的形式进行初始化
char greeting[] = "Hello";
以下是 C/C++ 中定义的字符串的内存表示:
C++ 中有大量的函数用来操作以null
结尾的字符串:
序号 | 函数 | 功能 |
---|---|---|
1 | strcpy(s1,s2) | 复制字符串 s2 到字符串 s1 |
2 | strcat(s1,s2) | 连接字符串 s2 到字符串 s1 的末尾 |
3 | strlen(s1) | 返回字符串 s1 的长度 |
4 | strcmp(s1,s2) | 返回s1与s2的比较结果 |
5 | strchr(s1,ch) | 返回一个指针,指向字符串s1中字符ch的第一次出现的位置 |
6 | strstr(s1,s2) | 返回一个指针,指向字符串s1中s2的第一次出现的位置 |
C++ 中的 String 类
C++ 标准库提供了 string 类类型,支持上述所有的操作,另外还增加了其他更多的功能。比如:
- append() – 在字符串的末尾添加字符
- find() – 在字符串中查找字符串
- insert() – 插入字符
- length() – 返回字符串的长度
- replace() – 替换字符串
- substr() – 返回某个子字符串
- …
4种字符串类型
C++中的字符串一般有以下四种类型,
- string
- char*
- const char*
- char[]
下面分别做简单介绍,并说明其中的一些区别
string
string是一个C++类库中的一个类,它位于名称空间std中,因此必须使用using编译指令或者std::string来引用它。它包含了对字符串的各种常用操作,它较char*
的优势是内容可以动态拓展,以及对字符串操作的方便快捷,用+
号进行字符串的连接是最常用的操作。
关于
string
的更多性质可以参考下面关于char *
的讨论。
char*
char*
是指向字符串的指针(其实严格来说,它是指向字符串的首个字母),你可以让它指向一串常量字符串。
const char*
与const char *
该声明指出,指针指向的是一个const char
类型,即不能通过当前的指针对字符串的内容作出修改
注意这里有两个概念:
- char * const [指向字符的静态指针]
- const char * [指向静态字符的指针]
前者const修饰的是指针,代表不能改变指针
后者const修饰的是char,代表字符不能改变,但是指针可以变,也就是说该指针可以指针其他的const char。
char[]
与char*
与许多相同点,代表字符数组,可以对应一个字符串,如
char * a="string1";
char b[]="string2";
这里a是一个指向char变量的指针,b则是一个char数组(字符数组)
字符数组(char [])和字符串指针变量(char *)的区别
以下几个表达是等价的
#include <stdio.h>
int main ()
{
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
printf("Greeting message: %s\n", greeting );
char greeting1[6] = "Hello"; //must over 5
//greeting2[1] = '1';
printf("Greeting1 message: %s\n", greeting1 );
char greeting2[] = "Hello";
printf("Greeting2 message: %s\n", greeting2 );
char *greeting3 = "Hello"; // can't change
printf("Greeting3 message: %s\n", greeting3 );
return 0;
}
又例如如下代码:
#include<iostream>
using namespace std;
int main()
{
char *p1 = "abcd";
char p2[] = "1234";
return 0;
}
这二者的区别还在于:
存储方式
p1是一个指针变量,有一块内存存储它,它的内容是字符串的地址,而**字符串本身是存放在以该首地址为首的一块连续的内存空间中并以'\0'
作为串的结束。**那么我们要访问字符串就先要取出p1中存储的地址,然后计算偏移量,进行访问;而p2是字符数组,是由于若干个数组元素组成的,它可用来存放整个字符串。
访问方式
不同于p1,p2直接