字串拷貝
Prerequisites:
陣列法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//參數2因為是常數字串,所以型態為const char*
char* myStrCpy(char* dest,const char* src) {
//i為dest陣列的索引
//j為src陣列的索引
int i = 0, j = 0;
// 如果來源字串不為0就進入迴圈
while(src[j]) {
//將src[j]的值給dest[i],然後i++,j++
dest[i++] = src[j++];
}
//將dest結尾放上空字元
dest[i] = 0;
return dest;
}
int main() {
char name[20];
//清空陣列記憶體中的值
memset(name, 0, sizeof(name));
myStrCpy(name, "Bill");
cout << "name = " << name << endl;
return 0;
}
name = Bill
指標法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//參數2因為是常數字串,所以型態為const char*
char* myStrCpy(char* dest,const char* src) {
//若src的值不為空就進入迴圈
while(*src) {
//將src的值指派給dest,接著指標往下個位址移動
*dest++ = *src++;
}
//將dest的值放上空字元
*dest = 0;
return dest;
}
int main() {
char name[20];
//清空陣列記憶體中的值
memset(name, 0, sizeof(name));
myStrCpy(name, "Bill");
cout << "name = " << name << endl;
return 0;
}
memcpy
將來源字串copy到目的字串,拷貝字數由參數3決定。
memcpy(目的字串, 來源字串, 要拷貝字數);
strlen(src)傳回是不包含'\0'的長度,所以再+1,才會把src的結尾'\0'拷貝到目的字串。
1
2
3
4
5
6
7
8
9
10
11
12
13
//參數2因為是常數字串,所以型態為const char*
char* myStrCpy(char* dest,const char* src) {
memcpy(dest, src, strlen(src) + 1);
return dest;
}
int main() {
char name[20];
//清空陣列記憶體中的值
memset(name, 0, sizeof(name));
myStrCpy(name, "Bill");
cout << "name = " << name << endl;
return 0;
}
改良式strncpy
傳統的strncpy,若n的長度小於src的長度,不會在dest結尾加上'\0'。
所以改良式strncpy,不管n是不是小於src的長度,都會在結尾加上'\0'。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//參數2因為是常數字串,所以型態為const char*
char* myStrnCpy(char* dest,const char* src,const size_t n) {
memcpy(dest, src, n);
*(dest + n) = 0;//增加結尾符號
return dest;
}
int main() {
char name[20];
//清空陣列記憶體中的值
memset(name, 0, sizeof(name));
myStrnCpy(name,"Bill",2);
cout << "name = " << name << endl;
return 0;
}