1. 字符串数组
标准C语言中没有字符串(string)类型,而只是在C++后添加了字符串string类,但是并不属于基础数据类型,只是类功能很强大,得到广泛应用。所以一般我们平时处理字符串,即字符序列,使用的都是字符串数组。
1.1 字符串数组定义
char nzArr1[6] = {'C','h','i','n','a','\0'};//‘\0’是字符串结束符
char nzArr2[10]= {'C','h','i','n','a'};//数组未初始化的索引位,系统自动补上'\0',即后5位都是'\0'。
或者:
char nzArr[] = "China"; //字符串常量最后隐含'\0'
这块需要注意几种赋初值方式的差异:
char nzArr1[ ] = {'C','h','i','n','a'};
char nzArr2[ ] = "China";
char nzArr3[6] = {'C','h','i','n','a'};
printf("%d\n",sizeof(nzArr1)); //结果为5
printf("%d\n",sizeof(nzArr2)); //结果为6
printf("%d\n",sizeof(nzArr3)); //结果为6
sizeof()计算的是类型或者变量的内存大小。
nzArr1没有指定数组大小,所以计算以初始化值个数为准。由于char类型所占内存为1个字节,所有计算结果为5。注意以数组初始化形式赋初值不会自动补字符串结束符’\0’。
nzArr2虽然也没有指定内存空间大小,但是以字符串形式赋初值,字符串常量本身就隐含了’\0’在结尾,所以计算结果为6。
nzArr3指定了数组大小,除去初始化的,未初始化的索引位系统会默认初始化为’\0’。
1.2 字符串数组赋值问题
我们直接看下面程序:
char nzArr[6];
nzArr = {'1','2'};//错误
注意字符串数组初始化和正常赋值的区别。字符串数组不可以整体赋值,只能单个位单个位赋值,即:
char nzArr[6];
nzArr[0] = '1';
nzArr[2] = '2';
同样的道理,哪怕两个字符串数组长度相同,也不可以互相整体赋值,只能通过引用元素单个位单个位赋值,例如:
char c1[6];
char c2[6] = "hello";
c1 = c2; //错误,不能整体赋值
2. strlen()和sizeof()区别
sizeof()只是计算类型或者变量内存大小的关键字,不是函数,没有所谓的头文件包含,就是C/C++的一个操作符。编译器自动识别,并且在编译阶段就自动计算了sizeof()的值。
strlen()是系统(string.h/cstring)头文件中定义的,用来计算以’\0’结尾的字符串长度的函数。它并不是计算内存大小,仅计算字符串从开端到’\0’结尾字符的个数(不包含’\0’)。并且只有在程序运行到strlen()函数地方,才运算统计字符串长度的结果。
例如:
char nzArr[10]="China";
int nNum =strlen(str); //结果为5
int nLenb =sizeof(str); //结果为10
也就是说sizeof()只跟你给该字符串数组定义了多大空间有关,而跟字符串是否结束无关。
所以当输入一行字符串,在不知道字符个数的时候,可以用strlen()函数来计算字符串长度,而sizeof()则不行。例如:
char str[100];
cin.getline(str,100); //获得流中一行输入的前100个字符,不足100到'\0结束'
int nLen = strlen(str);//得到实际字符串长度
int nNum = sizeof(str);//与输入字符串无关,都是字符串内存大小100
个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!
转载请注明出处:CSDN 无鞋童鞋。