字面值初始化字符数组及字符串拷贝注意

最后更新于:2022-04-01 14:24:01

~~~ char carr[] = "author:CSDN-iaccepted"; ~~~ 此时,carr数组中元素的个数为21,最后一个位置用来存放空字符'\0'。 所以如果写成carr[21] = "author:CSDN-iaccepted";就是错误的。 ~~~ int clen = strlen(carr); int size = sizeof(carr); ~~~ 这时候得到的clen = 21,size= 22。这就是因为strlen统计串中字符的个数,不计算最后的空字符,但是sizeof 是得到carr这整个字符串分配的内存大小,因为最后必须留一个位置来存放空字符,所以,占用22个内存单元,又因为1个字符类型占用1个字节,所以结果返回22(22个字节的内存空间)。 strcpy(char *dest,const char *src);这个函数在用的时候要注意,如下 ~~~ char src[] = "helloworld"; char dest[] = "hello"; ~~~ 这个时候执行strcpy(dest,src);会导致程序溢出而崩溃,所以通常的方法就是使用strncpy来代替strcpy。 strncpy的最后一个参数为size_t 类型的计数count,指明要拷贝长度。这个长度指定为strlen(dest)很合适了,因为strlen返回值不计算最后一个空字符,这样,src字符串的长度如果超过dest,那么只会拷贝跟dest一样的长度,这样dest的末尾正好还是有一个空字符的,这样是不会出错的。但是有的时候我们定义的src不一定含有末尾的空字符,这个时候strlen(str)就会出错。如下 ~~~ char src[] = {'h','e','l','l','o'}; char dest[] = "he"; ~~~ 这个时候就不能将拷贝长度指定为strlen(dest),所以一般情况下指定为strlen(dest)是非常危险的操作。这个时候要用到的就是sizeof了。 ~~~ strncpy(dest,src,sizeof(dest)); dest[sizeof(dest)-1] = 0; ~~~ 这样两条指令配合使用就不会发生错误了,所以,这里两行指令是拷贝字符串最安全的写法了(个人觉得)。
';