c/c++学习_字符串处理

来源:互联网 发布:清空数据库sql语句 编辑:程序博客网 时间:2024/06/05 15:50

c++字符串处理?

在c++中,有两种字符串,一种是从c沿袭过来的,称为c-字符串,简称c-串。c-串是以一个全0位(整数0)字节作为结束符的字符序列。该全0字节即是8位的整数0,也是ASCII码的0。

  • 1.c-串

c-串还称为ASCII串(即ASCII字符序列加上尾巴Zero)。 c-串也是字符串字面值,其格式为双引号括起来的字符序列,例如,"Hello!",它在空间的存储形式为:

'H'  'e' ' l '' l '' o '' ! '  0很显然,c-串的空间长度为字符串长度加1。(PS:c-串的字符序列总是添加一个结束标志)如果要将c-串放到字符数组,则元素个数非比字符数多1不可。

char buffer[7]="Hello!"   //若为char buffer[6]="Hello!";则为错误。

字符字面值的类型为char,那么c-串又是什么类型呢?c-串的类型为char*,说得更准确一点,是const char*。事实上,所有的字面值类型都是const的。char* 为字符指针,它与字符数组不同,但操作上是一样的,都表示c-串的起始地址。

  • 2.字符指针与字符数组(char Pointers & char Arrays)

指针是表示内存空间位置的类型。字符指针就是所指向的空间位置上的值,当做字符来操作的类型。

例如:char* str="Hello";

    cout<<*str<<endl;//显示H

   cout<<str<<endl;//显示Hello

str是字符指针变量。*str是字符指针变量的间接引用。即,若str指向“Hello”的首地址,则*str表示该地址代表的空间上的值----‘H’。

输出字符指针就是输出c-串。所以输出str时,便从‘H’字符的地址开始,输出所有字符直到遇到0。输出字符指针的间接引用,就是输出单个字符。所以输出*str时,便输出str所指向的字符‘H’。

经典例子:

#include "stdafx.h"#include "iostream"using namespace std;int _tmain(int argc, _TCHAR* argv[]){cout<<("join"=="join" ? "" : "not ")<<"equal\n"; //字面值比较char* str1="good";char* str2="good";cout<<(str1==str2 ? "" : "not ")<<"equal\n";//字符指针比较char buffer1[6]="Hello";char buffer2[6]="Hello";cout<<(buffer1==buffer2 ? "" : "not ")<<"equal\n";//字符数组比较return 0;}//由于c-串类型是字符指针,因此,比较两个相同的c-串的时候,会因空间的位置的不同而不同。//而且,分别存储两个相同c-串的字符数组,其数组比较也会是不相同的。

字符指针和字符数组的区别:

  1. 字符数组是由若干个元素组成的,每个元素存放一个字符;而字符指针变量存放的是字符首地址。
  2. 赋值方式不同,字符数组只能对各个元素分别赋值;而字符指针只需要赋值给字符串的首地址就好。
  3. 字符指针占用的内存要少于字符数组。
  4. 指针变量的值可以改变;而字符数组名虽然代表地址,但它的值不会变化。

  • 3.不得不配备专门操作的c-串库函数(c库函数设计了一系列的c-串库函数,解决了c-串的赋值、复制、修改、比较、连接等问题。)

这些库函数的操作,默认在string.h的头文件中。由于BAB编译器的iostream头文件嵌套包含了它,所以程序中省略了#include<string.h>

----------------->strcpy 读作 string copy;

其函数声明为:char* strcpy(char* x1, char* x2);

该函数将x2字串拷贝到x1所在位置,不论x1字串先前是什么内容,拷贝之后都将被所拷贝的内容覆盖。拷贝函数被调用之后,返回x1参数的首地址,目的是让调用结果可以直接参加之后的字串操作。

由于x2字串的长度比x1字串空间的要长,所以strcpy的使用并不安全,需要编程时谨慎考虑。很可能发生不可预料的运行错误

------------------>strcmp 读作 string compare;

其函数声明为:int strcmp(char* x1, char* x2);

它表示x1串与x2串进行字典序比较。如果x1小则返回值为负数;如果x1大,则返回非0正数;如果二者相等,则返回0。

------------------->strcat读作string concat;

其函数声明为:char* strcat(char* x1, char x2);

它将x2字串的内容接在x1字串之后,或者说,将x2字串拷贝到x1字串结束处。所返回的x1字串的结果可以直接参加之后的操作。

该调用会引起x1字串加长,或者说,结束符0的位置靠后。在x1字串之后所余自身空间不足以接纳x2字串时,调用函数将不安全。

-------------------->strrev读作string reverse;

其函数声明为:char* strrev(char* x);

它将字串倒过来,并改变原来的存储,同时直接将结果子串返回,以便于其后的操作。

-------------------->strset读作string set;

其函数声明为:char* strset(char*, char b);

它将x整个字符串的每个字符都用b字符来取代,并将x作为结果返回。

--------------------->strstr读作string substring;

其函数声明为:int strstr(char* x, char* s);

该函数在x字串中查找s字串。若找到,则返回整数1,否则返回整数0。

--------------------->strchr读作string char;

其函数声明为:int strchr(char* x, char b);

该函数在x字串中查找b字符。若找到,则返回整数1,否则返回整数0。

待续(睡觉









0 0