- C-串
在C++中,有两种字符串,一种是从C沿袭过来的,称为C-字符串,简称C-串,别称为ASCII串,C-串是一个全0位(整数0)作为结束符的字符序列,该全0字节既是8位的整数0,也是ASCII码的0.
C-串的空间长度为字符串长度加1,例如:
<span style="font-size:14px;"><span style="font-size:14px;">char buffer[7] = "Hello!";//若为char buffer[6] = "Hello!";则为错误!</span></span>
C-串的类型是什么呢?C-串的类型是char*(字符指针), 说的更精确一些,是const char* 。它与字符数组虽然类型不同,但操作上都是一样的,都表示C-串的起始地址
<span style="font-size:14px;"><span style="font-size:14px;">char* str = "Hello";
cout << *str <<endl; //显示H
cout << str << endl; //显示Hello</span></span>
str是字符指针变量,*str是字符指针变量的间接引用,输出字符指针的间接引用,就是输出单个字符。str指向"Hello"的首地址,因而输出*str表示该地址代表的空间上的值—"H"。输出字符指针就是输出C-串,所以当输出str时,就是从‘H’字符的地址开始,逐个输出所有字符直到遇到0; 由于C-串类型为字符指针,因此比较两个C-串的时候,会因空间位置的不同而不同,在库函数中,专门设计了对C-串进行一系列的操作的函数:
- char* strcpy(char* x1, char* x2);//拷贝函数,它表示将x2字串拷贝到x1所在的位置,将x1原先的内容覆盖,该函数调用后返回x1的首地址,目的是让调用结果可以直接参加之后的字串操作,需要注意的是,由于x2字串的长度可能比x1字串空间要长,所以strcpy的使用并不安全,如果a字符数组长度为3(小于s1的长度),则执行strcpy(a, s1)会让紧挨a数组的邻近内存空间中的数据也被修改,导致不可预料的错误
- int strcmp(char* x1, char* x2);//比较函数,它表示将x2串与x1串进行字典序列比较,如果x1小则返回值为负数,x1大则返回值为正数,相等则返回0
- char* strcat(char* x1, char* x2);//连接函数,它将x2的字串连接到x1字串后面,显然这会加长x1字串,或者说,结束符0后移,当x1字串之后所余的自身空间不足以接纳x2字串时,调用该操作将不安全
- char* strrev(char* x);//倒置函数,它将x字串倒过来,并改变原来的存储
- char* strset(char* x, char b);//设置函数,它将x字串的每个字符用b字符来代替
- char* strstr(char* x, char* s);//查找函数,在x字串中查找s字串,若找到,返回1,否则返回0
- char* strchr(char* x, char b);//查找函数,在x字串中查找b字符,若找到,返回1,否则返回0
这些就是一些长用的C-串库函数...,这些库函数的操作默认在string.h的头文件中
- string
string是STL提供的一种自定义类型,它处理空间占用问题是自动的,需要多少,用多少,不像字符指针那样,提心吊胆于指针脱钩时的空间游离,它可以从C-串转换得到,也可以转化为C-串...
string本身就是针对方便字符串来设计的,就如前面C-串中的函数操作,string都可以做到,用法简单,例如:
<span style="font-size:14px;">#include<iostream>
#include<algorithm>
using namespace std;
//------------------
int main(){
string a, s1 = "Hello ", s2 = "123";
a = s1; <span style="color:#3333FF;">//复制 </span>
cout << (a == s1 ? "" : "not ") << "equal" << endl; <span style="color:#3333FF;">//比较</span>
cout << (a += s2) << endl; <span style="color:#3333FF;">//连接 </span>
reverse(a.begin(), a.end()); //倒置
cout << a << endl;
cout << a.replace(0, 9, 2, 'c') << endl; //设置,将a串从下标0开始的9个子串用2个'c'字符代替
cout << (s1.find("ell") != -1 ? "" : "not ") << "found\n" << endl;//查找串
cout << (s1.find('c') != -1 ? "" : "not ") << "found\n" << endl;//查找字符
} </span>
从上述代码中可以看出string字符串的简便而又强大的功能,在C++的STL标准中,iostream资源是不包含string资源,而BCB编译器为表示友好,默认包含了string和string.h资源,需要注意的是string和string.h不是一回事,string资源是指string字符串类,string.h头文件是指诸多字符空间操作的库函数集合...对了,reverse函数包含在资源algorithm中,该函数的功能是将容器中的所有元素颠倒
string的定义方式:
<span style="font-size:14px;">//原始定义
string s = "Hello", t;</span>
类似于整型定义
<span style="font-size:14px;"><span style="font-size:12px;">//参数化的定义方式</span>
int a(35);
string s("Hello");
string t(3, 'H');<span style="font-size:12px;">//3个H构成一个字符串t</span>
string u(3);<span style="font-size:12px;">//3个空格构成一个字符串</span>
</span>
在操作字符串中,string比之char*(字符指针),即优雅又灵活,缺点是在大量的字符操作中,性能不如char*
string的一些输入输出:
<span style="font-size:14px;"><span style="font-size:12px;">//逐个单词的输入</span>
for(string s; cin >>s; )
cout << s << " ";</span>
整行的输入
<span style="font-size:14px;">string s;
getline(cin, s);
cout << s <<endl;</span>
- string流
string流用一个例子来讲解
用一个文件(a.txt)有若干行,不知道每行有几个整数,编程输出每行的整数和,该怎么实现?
代码如下:
<span style="font-size:14px;">#include<iostream>
#include<sstream>
#include<fstream>
using namespace std;
//------------------
int main(){
ifstream in("a.txt");
for(string s; getline(in, s); ){
int a, sum = 0;
for(istringstream sin(s); sin >> a; sum += a);
cout << sum << endl;
}
} </span>
getline(in, s);逐行将文件中的数值(一行字符串)给s,每一行就循环一次,直到为空为止,istringstream是string输入流,在资源是stream中,创建了sin流,参数为string对象,它将string实体看作是一个输入流,因而sin >> a 即是从string流中输入整数到a中,输啊输,直到输到最后一个整数为止
通过C-串与string的比较,string似乎更加适合用来编写C++程序,当然这只是我个人的一些看法哈,还是要看个人的习惯嘛
,总结就到这里了......对了,如有不对之处,请告诉我哈,先谢了