1. 函數原型
#include <string.h>
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);
void *memcpy(void *dest, const void *src, size_t n);
這幾個函數都能用來copy字符串,但是使用起來要特別小心,
1. 所謂的字符串都是以'\0'字符作為結束標志的,
所以任何時候一定要有意識的預留一個字節用於在字符串最後補上'\0'字符;
2. 使用strcpy函數時,一定要注意如果src字符串的長度大於dest預留的長度,
那麼就會踩內存。踩內存的後果是什麼?一切皆有可能;
3. 使用strncpy函數時,一定要特別注意一個問題:如果一不小心n的取值為
src字符串的長度,那此時strncpy的結果與strcpy的結果是一樣的,
從而就有可能發生踩內存了。所以這個n的取值,應該是以dest預留的大小為准;
4. memcpy它會copy整塊內存,而不會關心這中間是否有'\0'字符的,
所以如果想要copy整塊內存空間,那就只能使用memcpy函數。
如果使用strcpy或strncpy,如果內存空間中恰巧有'\0'字符,那就會出現非預期結果。
5. 什麼使用使用strcpy/strncpy,什麼時候使用memcpy,自己掂量一下吧。
測試代碼如下:
#include <stdio.h>
#include <string.h>
#define MAX_SRC_LENGTH (10)
#define MAX_DEST_LENGTH (8)
int main(int argc, char* argv[])
{
char src[MAX_SRC_LENGTH] = "123456789";
char dest[MAX_DEST_LENGTH] = {0};
strncpy(dest, src, MAX_SRC_LENGTH);
printf("\nsrc=%s,dest=%s\n", src, dest);
return 0;
}
試試看,
[sh] gcc main main.c
[sh] ./main
猜猜結果會怎樣?