有些题目在定义函数的时候采用的是char指针或者字符串传参,自己习惯STL的string,不太熟悉。所以这里对C语言中的Char数组做个总结;
关于Char字符串的初步概述:
相当于Int数组,只不过是char类型的。
但是需要注意的是Char数组在定义的时候一定要注意,结尾的'\0'是占一个位置的,如果忽略该字符,会导致异常的错误;
每一个char[]都以终结字符作为结尾,注意一下;
关于Char数组的长度问题:
注意关于sizeof和strlen的问题,两者的计量标准不同;
1.对于strlen来说,计量标准为字符串数组中的非终结符字符个数;
2.对于sizeof来说,计量标准为字符串中的所有位数,包含非终结符号;
对于相同的字符串char[]="12345";
strlen的结果为5;
sizeof的结果为6;
所以一般来说统计实际字符个数用strlen,而一般开辟赋值使用sizeof;
关于Char* 和 Char[] 的数组问题:
首先,对于C语言来说,char*是一种比较特殊的存在。
在之前OJ的题目中,有一道题有这样一个坑:
之前遇到这个问题,发现char* 传进去并不能改变实参,本质上的问题在于没有理解char*指针是个什么东西;
char[]本质上就是一个连续的区域,内部存储char元素;
一般的赋值语句:
char str[]="123124124";
str通常可以表示为一个指针,也就是char*,这个指针指向连续的数组区域;
例如str[0]的地址为0x001;
则char*表示的是一个单元内的内容,是0x001,也就是装着首字符的地址;
在通常情况下,char[]数组可以直接用char*来进行表示;
其次,重要的是访问问题;
尽管当str作为char*指针存在,但是由于字符串数组的特殊性质,可以直接对其进行下标访问,而不用使用指针的解引用访问;
但是一定要注意范围,因为如果不知道范围,有可能越界。
这个玩意不像C++的string,越界会报错;
因此对于该题目中,如果按照形参不传引用而是直接拷贝,则代表两个指针同时指向原来的char数组的首个元素;
所以对于自己起初的错误写法,针对于函数内部有:
c=(char*)molloc(sizeof(s)+1);
则改变的是c指向的空间,也就是重新开辟了一个数组,和之前的实参指针半点关系都没用,函数结束就自动销毁;
所以如果理解指针的特性,直接采用对指针指向的区域进行改造:
则直接就会把传进来的字符串进行改造,使得不用传引用就可以进行修改;
关于char数组的赋值问题:
关于赋值问题也要注意一下;
通常来说char数组赋初值有以下几个方式:
1.直接指定:
2.开辟空间:
这一般是进行重新赋值的时候;
c = (char*)malloc(sizeof(s) + 1);
之后再利用strlen进行填补也可以;
当然也可以利用strcpy,但是注意,空间一定要开的足够大,并且赋值的时候,编译器会默认在结尾加上'\0';
利用该函数也可以对其进行string STL库赋值,只不过要用string.c_str()函数;
注意:关于截断功能;
对于一个字符串,如果想从中间截短,直接在其中一位赋值'\0',即可截断;
个人觉得应该是在统计字符个数和输出时候,都以'\0'来作为结尾的;