1. 程式人生 > 其它 >字串函式(一):strcpy函式、strcat函式和strcmp函式

字串函式(一):strcpy函式、strcat函式和strcmp函式

技術標籤:字串函式c語言

這三個函式是字串函式中比較經常用到的函式,放在一起解釋是因為它們有一個共同點,就是操作的字串都不限制其長度。

strcpy函式

在這裡插入圖片描述
在官方的解釋中,strcpy函式的作用是拷貝一個字串。
該函式的引數有兩個,一個是目標字串,一個是源字串
返回值是字元指標,也就是目標字串的地址。

舉個例子:

int main()
{
	char arr1[] = "***************";
	char arr2[] = "abcdef";
	strcpy(arr1, arr2);
	printf("%s\n",
arr1); return 0; }

在使用strcpy函式的時候要注意以下幾點:
1.源字串必須以’\0’結尾,否則複製字串的時候沒有終止條件。
2.在拷貝的時候,源字串中的’\0’也會拷貝到目標字串裡。
3.strcpy函式不能判斷拷貝過去的字串的大小,也就是無法判斷會不會越界訪問,因此在利用strcpy函式進行拷貝的時候,目標字串的空間必須足夠放下源字串。

strcat函式

在這裡插入圖片描述
strcat函式的作用是將兩個字串連線起來
函式的引數和strcpy一樣,一個是目標字串,一個是源字串
返回引數是目標字串的地址

舉例:

int main()
{
	char arr1[20] = "hikgjjk"
; char arr2[] = "abcdef"; strcat(arr1, arr2); printf("%s\n", arr1); return 0; }

要注意的幾點:
1.源字串必須以’\0’為結束標誌,作為終止條件
2.在進行字串連線的操作時,定義字串的陣列的陣列長度就不能為空,必須是能夠容納連線之後新字串的長度。

這裡還涉及到一個問題,就是利用strcat函式能不能自己連線自己?
答案是不行的,這個與地址相同無關,因為連線字串是以’\0’為結束標誌的,但是自己連線自己就會把原來的’\0’覆蓋掉,從而沒有了終止條件。

strcmp函式

在這裡插入圖片描述
strcmp函式的作用是比較兩個字串的大小,比較的方式是用ASCII碼進行比較。

函式的引數是兩個字串
返回值是一個整數。
如果字串1大於字串2,返回大於0的數;
如果字串1等於字串2,返回0;
如果字串1小於字串2,返回小於0的數。

舉例:

int main()
{
	char arr1[20] = "hikgjjk";
	char arr2[] = "abcdef";
	int ret=strcmp(arr1, arr2);
	printf("%d\n", ret);
	return 0;
}

需要注意的是,在VS2013的編譯器上,strcmp的返回值是1、0、-1,但是換一個編譯器就不一定是這樣的,因此在使用的時候,要先看看在你的編譯器上的返回值是什麼再進行相關功能的編寫。

模擬實現

最後是我將上面的函式進行了模擬實現,大家可以根據這些瞭解其內部是怎樣實現的。

strcpy函式

char* my_strcpy(char* arr1, const char* arr2)//返回值是目標字串的地址,函式引數中源字串不能被改變,否則就會出錯
{
	assert(arr1&&arr2);
	char* str = arr1;
	while (*arr1++ = *arr2++)//如果在迴圈內部進行對兩個字串++的話,在迴圈出來還要再將'\0'賦值給目標字串
		                     //這樣寫會簡化程式碼,先解引用再加加,並且用賦值操作符,*arr1的值就是迴圈條件,直到賦值為‘\0’
	{
		;
	}
	return str;

}

strcat函式

char* my_strcat(char* str1, const char* str2)
{
	assert(str1&&str2);
	char* str = str1;

	while (*str1)//如果判斷是*str1++,就會在判斷str1遇到'\0'之後再加加一次,就會將字元後面的'\0'跳過,所以只能輸出cxd
	{
		str1++;//而把加加放在裡面,在判斷之後就不會在進行加加操作,就會正常
	}

	while ((*str1++ = *str2++))//然後連結的部分就相當於複製
	{
		;
	}
	return str;
}

strcmp函式

int my_strcmp(const char* str1,const char* str2)
{
	assert(str1&&str2);
//兩個字串相等則繼續向後比較,如果不相等就返回兩者之差
	while (*str1 == *str2&&*str1!='\0'&&*str2!='\0')//迴圈的條件是元素相等,並且兩個字串還沒有到頭
	{
		str1++;
		str2++;
		if (*str1 == '\0' && *str2 == '\0')
			return 0;
	}

	return *str1 - *str2;
}