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 |
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-串的字符数组,其数组比较也会是不相同的。
字符指针和字符数组的区别:
- 字符数组是由若干个元素组成的,每个元素存放一个字符;而字符指针变量存放的是字符首地址。
- 赋值方式不同,字符数组只能对各个元素分别赋值;而字符指针只需要赋值给字符串的首地址就好。
- 字符指针占用的内存要少于字符数组。
- 指针变量的值可以改变;而字符数组名虽然代表地址,但它的值不会变化。
- 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。
待续()