C---字符串的拷貝 & 反轉

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左偏移,然後不斷地首尾置換,最終達到反轉的目的。
  • 重點需要強調的是:指針變量也是可以比較大小的,對比的是地址的大小
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章