c/c++ 字符数组、字符指针和字符串类型

一、字符数组

定义:用来存放字符数据的数组是字符数组,字符数组中的一个元素存放一个字符。字符数组具有数组的共同属性。

初始化方式:

1 charc[10]={'0','1','2','3','4','5','6','7','8','9'};

注:当初值个数小于规定长度时,其余元素自动填充为 '\0'

2 charc[]={'0','1','2','3','4','5','6','7','8','9'};

系统自动计算长度为10

3 char c[]="0123456789"; 或 char c[]={"0123456789"};

此时长度为11,因为创建字符串的时候最后面自动添加了'\0','\0'的ASC2码为0

字符串输出:

谨记一条,以'\0'为结束符,如以下程序是不安全的

char c[3]={'0','1','2'};  
cout<<c<<endl;  

输出结果除abc外还有一系列不可预知的项

cout<<sizeof(c);//输出为数组固定值  
char str[]="0123456789"; cout<<sizeof(str)<<endl;//输出11  
<span style="font-family: Arial, Helvetica, sans-serif;">cout<<strlen(str)<<endl;//输出10  </span>

输入时,所输字符串长度应短语数组长度,否则后果严重。

库函数:put(str),gets(str),strcat(str1,str2),strcpy(str1,str2),strcmp(str1,str2),strlen(str),strlwr(str),strupr(str)

综上,字符串数组的使用比较灵活,但安全性上实在是寒碜,只使用特别清晰、简单的小程序。

 

二、字符指针

初始化:

char *str="hello world!"; 

说到底,str是一个字符指针,这句仅仅是将“hello world!”的第一个字符的地址赋予str

cout<<*(str+4)<<endl;//这句输出的是 o

cout<<*str<<endl;//这句输出   h  
<pre name="code" class="cpp">cout<<str<<endl;//这句输出hello world!  

 
 

str输出是字符串,不是地址,这与cout这个标准输出对象有关系的,在遇到字符型指针时会将其当作字符串名来处理,输出指针所指的字符串,直到遇到0x00。而str的值就是地址。数据类型是字符的(*str)则只输出单个字符。

如果用cout输出地址,则需要对字符型指针进行强制类型转换,我们得用static_cast来实现,把字符型指针转换成无类型指针

cout << "字符串起始地址值: "<< static_cast<const void *>(str) << endl;

如果使用C风格则更为方便

// 输出字符串
printf("字符串:%s\n", str);
// 输出地址值
printf("字符串起始地址值:%p\n", str);

char* c和charc[]的区别在于前者是变量,后者是常量。

三、c++提供的标准库string

string本质是一个类,因此可以进行运算符的重载,还可以自定义方法,带来极大的灵活性,同时符合高内聚低耦合的程序设计原则。

使用前的准备工作:

[cpp] view plaincopyprint?

1.  #include<string>  

2.  using std::string;  

初始化方法:

[cpp] view plaincopyprint?

1.  string s2(s1);//初始化为s1的一个副本  

2.  string s("value");//常量初始化  

3.  string s(n,'c');//n个字符'c'  


在使用的时候,只需把string当成一个基本类型就可以了,这样做有两个极大的好处:

1 再也不用管什么字符串长度啊、越界之类的问题。

2 赋值可以用“=”直接操作,连接可用“+”直接操作,比较可用关系运算符直接操作,提升了可读性。

3 自定义方法,解耦合。

string的操作:

string str="hello";  
cout<<str.size()<<endl;//长度检测  
cout<<str.empty()<<endl;//检测是否为空<span style="background-color: rgb(245, 250, 226); font-family: Arial, Helvetica, sans-serif;">  </span>

输出:

5

0

需要指出的一点是:

str.size()返回值的类型是string::size_type,存储str.size()结果的变量必须为string::size_type类型,虽然不清楚它具体是个神马类型(连c++ primer上都这么说),但可以肯定是不同于int类型的,因为它是unsigned类型的,这样它能表示的长度是signed类型的两倍,此外肯定还有别的优越性。

下标操作的时候,str用法与数组名类似。

原文参考:http://blog.csdn.net/goodcat12/article/details/7775350


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值