一、字符数组
定义:用来存放字符数据的数组是字符数组,字符数组中的一个元素存放一个字符。字符数组具有数组的共同属性。
初始化方式:
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.youkuaiyun.com/goodcat12/article/details/7775350