~~~
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;
~~~
這樣兩條指令配合使用就不會發生錯誤了,所以,這里兩行指令是拷貝字符串最安全的寫法了(個人覺得)。