C风格字符串

字符串实际上是使用null字符 \0终止的一维字符数组

声明和初始化创建了一个字符串:
char site[10] = {'A', 'L', 'E', 'X', 'W', 'O' , 'R' ,'L','D', '\0'};

由于在数组的末尾存储了空字符,所以字符数组的大小比单词 ALEXWORLD的字符数多一个。

依据数组初始化规则,您可以把上面的语句写成以下语句:
char site[] = "ALEXWORLD";

其实,您不需要把字符放在字符串常量的末尾。C++编译器会在初始化数组时,自动把\0放在字符串的末尾。

C++ 中有大量的函数用来操作以 null 结尾的字符串:

strcpy(s1, s2);

复制字符串 s2 到字符串 s1。

strcat(s1, s2);
连接字符串 s2 到字符串 s1 的末尾。连接字符串也可以用 + 号,例如:
string str1 = "alex";
string str2 = "world";
string str = str1 + str2;

strlen(s1);
返回字符串 s1 的长度。

strcmp(s1, s2);
如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回值小于 0;如果 s1>s2 则返回值大于 0。

strchr(s1, ch);
返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。

strstr(s1, s2);
返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。

C++ 中的 String 类

C++ 标准库提供了 string 类类型,支持上述所有的操作,另外还增加了其他更多的功能。(注意string.h和string是不一样的头文件)

1、string的定义

string str;

如果要初始化,可以直接给string类型的变量进行赋值。

string str="abcd";

2、string中内容的访问

(1)通过下标访问

一般来说,可以直接像字符数组那样去访问string。

如果要读入和输出整个字符串,则只能用cin和cout。

#include <iostream>
#include <string>
using namespace std;

int main(){
    string str;
    cin >> str;
    cout << str;
}

(2)通过迭代器访问

一般仅通过(1)即可满足访问的要求,但是有些函数比如insert()与erase()则要求以迭代器作为参数。

string::iterator it;

#include <iostream>
#include <string>
using namespace std;

int main() {
    string str="abcd";
    for (string::iterator it = str.begin(); it != str.end(); it++) {
        printf("%c", *it);
    }
}

3、string常用函数实例解析

(1)operator+=

这是string的加法,可以将两个string直接拼接起来。

(2)compare operator

两个string类型可以直接使用==、!=、<、<=、>、>=比较大小,比较规律是字典序。

(3)length()/size()

length()返回string的长度,即存放的字符数,时间复杂度为O(1)。size()与length()基本相同。

(4)insert()

string的insert()函数有很多种写法,这里给出几个常用的写法,时间复杂度均为O(N)。

(5)erase()

erase()有两种用法:删除单个元素、删除一个区间内的所有元素。时间复杂度均为O(N)。

(6)clear()

clear()用以清空string中的数据,时间复杂度一般为O(1)。

(7)substr()

substr(pos,len)返回从pos号位开始、长度为len的字串,时间复杂度为O(len)。

(8)string::npos

string::npos是一个常数,其本身值为-1,但由于是unsigned_int类型,因此实际上也可以认为是unsigned_int累心的最大值。string::npos用以作为find函数失配时的返回值。

(9)find()

str.find(str2),当str2是str的子串时。返回其在str中第一次出现的位置;如果str2不是str的子串,那么返回string::npos。

str.find(str2,pos),从str的pos号位开始匹配str2,返回值与上相同。

(10)replace()

str.replace(pos,len,str2)把str从pos号位开始、长度位len的子串替换为str2.

str.replace(it1,it2,str2)把迭代器[it1,it2)范围的子串替换为str2。

注意:

使用cin获取字符串时,无法读取含有空格的字符串。

因此需要用到函数getline()

string str;
getline(cin,str);

用printf来输出string,用c_str()将string类型转换为字符数组进行输出,

string str="abcd";
printf("%s\n"str.c_str());

字符串赋空

string str="";