c/c++ 字符数组、字符指针跟字符串类型总结帖

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

一、字符数组

定义略

初始化方式:

1 char c[10]={'a','b','c','d','e','f','g','h','i','j'};

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

2 char c[]={'a','b','c','d','e','f','g','h','i','j'};

系统自动计算长度为10

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

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

字符串输出:

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

char c[3]={'a','b','c'};
cout<<c<<endl;
输出结果除abc外还有一系列不可预知的项

这就是c++繁杂的地方,但是我们可以以毒攻毒,c++的不安全性还有个体现就是数组可以越界操作,如

char c[3]={'a','b','c'};
c[3]='\0';
cout<<c<<endl;
这样输出就是正常的了,当然了,这个例子只是技术探究,实际不可能这么用

cout<<sizeof(c);//输出为数组固定值
char str[]="abcdefghij";
cout<<sizeof(str)<<endl;//输出11
char str[]="abcdefghij";
cout<<strlen(str)<<endl;//输出10
输入时,所输字符串长度应短语数组长度,否则后果严重。

库函数: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
cout<<str<<endl;//这句输出hello world!
道理是显然的,数据类型是字符指针的,则从所指地方开始输出直到'\0'结束,数据类型是字符的(*str)则只输出单个字符。
char* c和char c[]的区别在于前者是变量,后者是常量。


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

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

使用前的准备工作:

#include<string>
using std::string;
初始化方法:

string s2(s1);//初始化为s1的一个副本
string s("value");//常量初始化
string s(n,'c');//n个字符'c'

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

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

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

3 自定义方法,解耦合。

string的操作:

string str="hello";
cout<<str.size()<<endl;//长度检测
cout<<str.empty()<<endl;//检测是否为空
输出:

5

0

需要指出的一点是:

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

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

如非特殊需要,笔者的编程基本全部使用了此类库。