关闭

C标准和C++标准字符串说明

1767人阅读 评论(0) 收藏 举报
C里面只能通过char定义c风格字符串(C++中有String),通常有3种方式,格式就是
char 数组名[] = "字符串" 
或者
char 数组名[] = {"字符串"}
或者
char *指针名= "字符串" 


sizeof可以计算一个类型的大小空间 
length只是针对字符串而言的 


标准c里没有length这个函数 
只有在C++中的string类中才有length这个函数


在这里还要介绍下strlen.


sizeof("abcd")的值为5(任意一个类型)
length("abcd")的值为5(string才有这个函数)

strlen("abcd")的值为4,不计算后面的'\0'


为了更好的理解字符串的使用,以下是从标准C和标准C++的角度,对字符串的使用进行了说明。

1. C语言的字符串

C语言没有专门定义字符串数据类型(如其他语言中的string),它用以'/0'结尾的字符数组来表示一个逻辑意义上的字符串。字符串字面型就是const char型的数C语言定义的字符串我们称之为“风格字符串”(C-style character string),而字符串字面值就是该类型的实例。实际上,C风格字符串既不能确切地归结为C语言的类型,也不能归结为C++语言的类型,就是以空字符 null束的字符数:

char cStringA[]={'a','b','c'};     //没有null字符,不是C-style的字符串

char cStringB[]={'a','b','c','/0'};  //包含null字符

char cStringC[]="abc";         //自动添加null的结束符

const char *cpString="abc";    //自动添加null的结束符

char *cpString1cStringA;    //指向了字符数组首地址,不是C-style的字符串

char *cpString2cStringB;    //指向含有null的字符数组首地址,是字符串

 

 

2. C标准库函数

 

下面列出了C语言标准库提供的一系列处理C风格字符串的库函数.要使用这些标准库函数,必须包含相应的C头文件。<string.h>是C语言提供的字符串处理标准库。以下是C标准库中常用的字符串处理函数:

 

strlen(s)        //返回s的长度,不包括字符串结束符null

strcmp(s1,s2)    //比较两个字符串s1和s2是否相同.若s1与s2相等,返回0;

//若s1大于s2,返回正数;若s1小于s2,则返回负数

strcat(s1,s2)    //将字符串s2连接到s1后,并返回s1

strcpy(s1,s2)    //将s2复制给s1,并返回s1

strncat(s1,s2,n) //将s2的前n个字符连接到s1后面,并返回s1

strncpy(s1,s2,n) //将s2的前n个字符复制给s1,并返回s1

 

注意:这些标准库函数不会检查其字符串参数。传递给这些标准库函数例程的指针必须具有非零值,并且指向以null结束的字符数组中的第一个元素.其中一些标准库函数会修改传递给它的字符串,这些函数将假定它们所修改的字符串具有足够大的空间接收本函数新生成的字符,程序员必须确保目标字符串必须足够大.

3. 标准C++的字符串

 

在C++中则把字符串封装成了一种数据类型string,可以直接声明变量并进行赋值等字符串操作。首先,为了在我们的程序中使用string类型,我们必须包含头文件 。如下:

#include //注意这里不是string.h string.h是C字符串头文件


声明一个字符串变量很简单:
    string Str;

这样就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str初始化为一个空字符串。String类的构造函数和析构函数如下:


a)    string s;               //生成一个空字符串s
b)    string s(str)           //拷贝构造函数 生成str的复制品
c)    string s(str,stridx)      //将字符串str内“始于位置stridx”的部分

//当作字符串的初值
d)    string s(str,stridx,strlen) //将字符串str内“始于stridx且长度顶多

//strlen”的部分作为字符串的初值
e)    string s(cstr)           //将C字符串作为s的初值
f)    string s(chars,chars_len) //将C字符串前chars_len个字符作为字符串s的初值。
g)    string s(num,c)        //生成一个字符串,包含num个c字符
h)    string s(beg,end)      //以区间beg;end(不包含end)内的字符作为字符串s的初值
i)    s.~string()             //销毁所有字符,释放内存

关于Sting类的字符串操作函数在本文最后简单列举一下,要详细了解,大家可以查阅相关资料。

 

注意

1.string类是C++标准库中定义的类类型。在C++中将字符串作为一个对象来管理。

2.C++是有命名空间的概念的,标准C++库的命名空间是std。所以C++字符串类也

经常用后面的形式来用:std::string

4. C++字符串和C字符串的转换

 

C++提供的由C++字符串得到对应的C_string的方法是使用data()、c_str()和copy(),其中,data()以字符数组的形式返回字符串内容,但并不添加’/0’。c_str()返回一个以‘/0’结尾的字符数组,而copy()则把字符串的内容复制或写入既有的c_string 或字符数组内。C++字符串并不以’/0’结尾。我的建议是在程序中能使用C++字符串就使用,除非万不得已不选用c_string。

 

5. 关于,,的区别

(1) C的字符串文件是,在C++里个文件成了,string前面的c表示这 个是c言的;而C++的字符串文件是,是利用的模板实现的,跟原先C的实现方法不一,但要安全得多。

(2) VC++中有文件,它就是C中的那个; 
而文件
实际上只是在一个命名空std中include了,是因C++要减少名称染;所以两个都是可以用的

(3) 字符串实现了一个,而其是依靠模板做的使用,可以将问题局部化,似于把一个大问题分解成一个个小问题;而且是具有型安全的。同时是标准C++类,移植性好,所以最好最好用C++的不过在我们嵌入式开发中,特别是硬件相关的开发,尽量使用C风格的字符串。

(4) 特别说明一下,在VC++中除了有string类以外还有CString类,CString是MFC的类,不搞Windows MFC程一般用不到这个类。

6.             C++标准库string类与STL的关系

STL即标准模板库(Standard Template Library),它包括五大类组件:算法、容器、迭代器、函数对象、适配器。

STL 是C++标准库的一部分,但不是全部。C++标准库是std名字空间中的所有内容,就是那些不带.h的头文件, 如、、。如std::string,及IO流都不属于STL,但它们是STL兼容的,可以应 用迭代器,算法等。虽然std::string和IO流也是模板类,但并不属于STL。



附录:String类的操作函数

begin       得到指向字符串开头的Iterator

end       得到指向字符串结尾的Iterator

rbegin       得到指向反向字符串开头的Iterator

rend       得到指向反向字符串结尾的Iterator

size       得到字符串的大小

length()       和size函数功能相同

max_size       字符串可能的最大大小

capacity       在不重新分配内存的情况下,字符串可能的大小

empty       判断是否为空

operator[]       取第几个元素,相当于数组

c_str       取得C风格的const char* 字符串

data       取得字符串内容地址

operator=       赋值操作符

reserve       预留空间

swap       交换函数

insert       插入字符

append       追加字符

push_back       追加字符

erase       删除字符串

clear       清空字符容器中所有内容

resize       重新分配空间

assign       和赋值操作符一样

replace       替代

copy       字符串到空间

find       查找,返回基于0的索引号

rfind       反向查找

find_first_of       查找包含子串中的任何字符,返回第一个位置

find_first_not_of       查找不包含子串中的任何字符,返回第一个位置

find_last_of       查找包含子串中的任何字符,返回最后一个位置

find_last_not_of       查找不包含子串中的任何字符,返回最后一个位置

substr(n1,len)       得到字符串从n1开始的长度为len的子串

 

以下为比较字符串(支持所有的关系运算符)

compare       比较字符串

operator+       字符串链接

operator+=       += 操作符

operator==       判断是否相等

operator!=       判断是否不等于

operator<       判断是否小于

operator>>       从输入流中读入字符串

operator<<       字符串写入输出流

getline       从输入流中读入一行


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:50891次
    • 积分:644
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:15篇
    • 译文:0篇
    • 评论:16条
    最新评论