0.strcpy函數
C語言中,有一個專門的strcpy函數用來拷貝字符串用的,可以把字符串或指針指向的字符串,拷貝到字符數組中。在一些特殊情況下,如果strcpy函數無法使用,或許可以自己寫一個拷貝的方法
// strcpy函數的簡單用法
void main() {
char name[10];
strcpy(name, "alien");
printf("%s \n", name);
}
// alien 結果
有關strcpy函數的詳細一些的用法,可參看博客:
C—數組相關常見的坑(字符數組、字符指針、strcpy與=區別)
1.字符串拷貝—常規方法
#include <stdio.h>
void str_cpy_01(char* dest, char* resource) {
int length = strlen(resource); // strlen()函數傳入的是數組指針或指針變量
for (int i = 0; i < length; i++) {
dest[i] = resource[i];
}
dest[length] = '\0';
};
int main() {
char name[20] ;
char * p = "alien";
str_cpy_01(name, p);
printf("%s \n", name);
};
alien
str_cpy_01函數中: dest[length] = ‘\0’:
- dest指針指向的數組,如果是name[20]這種方式定義,那最後一個元素就是不確定的數據,可能多打印無用的內容。
- 如果name[20] = {0},這種方式,則確定了最後一個元素爲0,printf("%s \n", name); 的時候,遇到0就停止打印了
main函數中:str_cpy_01(name, p):
- 傳遞的name是數組名,也就相當於&name。
- 而隱藏的含義是,* temp_p = &name(temp_p可以看做過渡的指針),所以傳遞name,就是傳遞一個過渡的指針給到函數str_cpy_01
strlen()函數的原型:
unsigned int strlen(const char *str);
strlen()函數裏面,可以傳遞數組指針 或者 字符串變量
2.字符串拷貝—指針法
對應的知識點:
int main() {
char* p = "alien";
printf("%d \n", sizeof("alien")); //字符串alien,對應的其實還有一個隱藏的0,sizeof計算的大小包含0
printf("%d \n", strlen("alien")); //strlen()計算字符串長度,這個不包含0
printf("=================\n");
printf("%c \n", *(p + 4));
printf("%d \n", *(p + 5));
printf("%d \n", *(p + 6));
}
6
5
=================
n // 字符串的最後一個元素
0 // 字符串隱藏的最後一個元素0
0 // 其實已經越界了,打印的這個數據也可能是其他數字
void str_cpy_02(char* dest, char* resource) {
while (*resource != '\0') {
*dest = *resource;
dest++;
resource++;
}
*dest = '\0'; //相當於是遍歷到最後一個元素,然後把目標字符串對應的索引賦值爲'\0'
};
int main() {
char name[20];
char* p = "alien";
str_cpy_02(name, p);
printf("%s \n", name);
};
*str_cpy_02 函數 resource != ‘\0’:
這句隱藏的含義是,選擇源指針resource指向的元素的值,不爲0的,其實就是所有正常顯示的字符數組。
3.字符串的反轉
1.數組元素置換法
#include <stdio.h>
#include<string.h> // strlen函數在這個頭文件裏面,不用也不會出錯,但會有警告
void string_convert(char* arr) {
int start = 0;
int end = strlen(arr) - 1;
while (start < end) {
char temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
++start;
--end;
}
};
void main() {
char name[10] = "alien";
string_convert(name);
printf("%s \n", name);
}
neila
main函數中char alien[10] = “alien”:
- alien字符串存儲在常量區
- 局部變量字符數組name存儲在棧區,由系統自動分配和釋放。賦值的過程只是把值賦給棧區。
- 賦值完,再去讀取和修改name的值,其實都修改的是棧區的內容,而不是常量區的內容
2.數組指針置換法:
#include <stdio.h>
#include<string.h>
void string_convert(char* arr) {
int length = strlen(arr);
char* p_start = arr;
char* p_end = arr + length - 1;
while (p_start < p_end) {
char temp = *p_start;
*p_start = *p_end;
*p_end = temp;
++p_start;
--p_end;
}
};
void main() {
char name[10] = "alien";
string_convert(name);
printf("%s \n", name);
}
neila
- 使用兩個指針,一個指向數組的首元素,一個指向數組的尾元素
- 通過指針的偏移,p_start 右偏移,p_end左偏移,然後不斷地首尾置換,最終達到反轉的目的。
- 重點需要強調的是:指針變量也是可以比較大小的,對比的是地址的大小