C-串与string的区别(C++)

来源:互联网 发布:盼盼交友软件靠谱吗 编辑:程序博客网 时间:2024/05/20 11:48
  • 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; //显示Hcout << str << endl; //显示Hello</span></span>

str是字符指针变量,*str是字符指针变量的间接引用,输出字符指针的间接引用,就是输出单个字符。str指向"Hello"的首地址,因而输出*str表示该地址代表的空间上的值—"H"。输出字符指针就是输出C-串,所以当输出str时,就是从‘H’字符的地址开始,逐个输出所有字符直到遇到0;
由于C-串类型为字符指针,因此比较两个C-串的时候,会因空间位置的不同而不同,在库函数中,专门设计了对C-串进行一系列的操作的函数:
  1. char* strcpy(char* x1, char* x2);//拷贝函数,它表示将x2字串拷贝到x1所在的位置,将x1原先的内容覆盖,该函数调用后返回x1的首地址,目的是让调用结果可以直接参加之后的字串操作,需要注意的是,由于x2字串的长度可能比x1字串空间要长,所以strcpy的使用并不安全,如果a字符数组长度为3(小于s1的长度),则执行strcpy(a, s1)会让紧挨a数组的邻近内存空间中的数据也被修改,导致不可预料的错误
  2. int strcmp(char* x1, char* x2);//比较函数,它表示将x2串与x1串进行字典序列比较,如果x1小则返回值为负数,x1大则返回值为正数,相等则返回0
  3. char* strcat(char* x1, char* x2);//连接函数,它将x2的字串连接到x1字串后面,显然这会加长x1字串,或者说,结束符0后移,当x1字串之后所余的自身空间不足以接纳x2字串时,调用该操作将不安全
  4. char* strrev(char* x);//倒置函数,它将x字串倒过来,并改变原来的存储
  5. char* strset(char* x, char b);//设置函数,它将x字串的每个字符用b字符来代替
  6. char* strstr(char* x, char* s);//查找函数,在x字串中查找s字串,若找到,返回1,否则返回0
  7. 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++程序,当然这只是我个人的一些看法哈,还是要看个人的习惯嘛

,总结就到这里了......对了,如有不对之处,请告诉我哈,先谢了

2 0
原创粉丝点击