天天看點

【C語言學習】字元串操作函數(1)——————>strlen strcpy strcmp 詳解與手動實作

字元串操作函數

      • 一、strlen
      • 二、strcpy
      • 三、strcmp

前言

C語言中對字元和字元串的處理是很頻繁的,但是C語言本身是沒有字元串類型的,字元串通常放在常量字元串中或者字元數組中。字元串常量适用于那些對它不做修改的字元串函數

一、strlen

strlen ——————————
參數類型 (const char* str)
傳回類型 (size_t)
功能 求解字元串長度
  • 字元串以 ‘\0’ 作為結束标志,strlen函數傳回的是在字元串中‘\0’前面出現的字元個數。(不包含‘\0’)
  • 參數指向的字元串必須要以‘\0’結束
  • 注意函數的傳回值是size_t,是無符号類型的(易錯)
  1. strlen模拟實作
周遊字元串中的每個字元,發現不是‘\0’就計數一次,直到發現’\0’後傳回總計數次
  • ①計數法實作strlen
int my_strlen1(const char *str)
{
	int count = 0;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char arr[20];
	gets(arr);
	int ret = my_strlen1(arr);//1.計數器方式
	printf("%d\n", ret);
	return 0;
}
           
【C語言學習】字元串操作函數(1)——————>strlen strcpy strcmp 詳解與手動實作

gets()函數用來擷取鍵盤上輸入的字元串,這裡輸了了“This is my life”

  • ②函數遞歸法實作

    遞歸的思想即自己調用自己,化複雜問題為簡單問題。

【C語言學習】字元串操作函數(1)——————>strlen strcpy strcmp 詳解與手動實作

假設現在求字元串“ABCDEFG”的長度,遞歸的思想即調用自己求“BCDEFG”的長度,無限調用自己,“CDEFG”、“DEFG”……,直到最後不再滿足調用條件。

【C語言學習】字元串操作函數(1)——————>strlen strcpy strcmp 詳解與手動實作
int my_strlen2(const char*str)
{
	if (*str)
	{
		return 1+my_strlen2(++str);
	}
	return 0;
}
int main()
{
	char arr[20];
	gets(arr);
	int ret = my_strlen2(arr);//2.遞歸
	printf("%d\n", ret);
	return 0;
}
           

遞歸示範如下:

【C語言學習】字元串操作函數(1)——————>strlen strcpy strcmp 詳解與手動實作

二、strcpy

strcpy ——————————
參數類型 (char * destination , const char * source)
傳回類型 (char*)
功能 拷貝源字元串到目标空間
  • 源字元串必須以 ‘\0’ 結束。
  • 會将源字元串 ‘\0’ 拷貝到目标空間。
  • 目标空間必須足夠大,以確定能存放源字元串。
  • 目标空間必須可變。(非常量字元串)
  • 類似于memcpy。

strcpy處理的對象是字元串類型,可以用char*類型的指針解引用操作,拷貝源字元

【C語言學習】字元串操作函數(1)——————>strlen strcpy strcmp 詳解與手動實作

為了增加代碼的安全性,引入了assert函數,用來判斷目标位址與源位址是否有效

void my_strcpy(char *dest, const char* src)
{
	assert(dest&&src);
	char* ret=dest;
	while (*src && (*dest++ = *src++))
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[50];
	char arr2[20];
	gets(arr1);
	gets(arr2);
	my_strcpy(arr1, arr2);
	printf("%s\n", my_strcpy(arr1,arr2));
	return 0;
}
           

my_strcpy函數内部代碼簡潔高效,當然不熟悉的也可寫的稍微複雜些,如下:

char* my_strcpy(char *dest, const char* src)
{
	assert(dest&&src);
	char* ret = dest;
	while (*src)
	{
		*dest=*src;
		dest++;
		src++;
	}
	*dest = *src;
	return ret;
}
           

代碼示範如下:

【C語言學習】字元串操作函數(1)——————>strlen strcpy strcmp 詳解與手動實作

三、strcmp

strcmp ——————————
參數類型 (const char* str1 , const char* str2)
傳回類型 int
功能 比較兩個字元串
  • 第一個字元串大于第二個字元串,則傳回大于0的數字。
  • 第一個字元串等于第二個字元串,則傳回0。
  • 第一個字元串小于第二個字元串,則傳回小于0的數字。
  • 字元串比較的實質是比較對應字元的ASCII碼值。
【C語言學習】字元串操作函數(1)——————>strlen strcpy strcmp 詳解與手動實作
【C語言學習】字元串操作函數(1)——————>strlen strcpy strcmp 詳解與手動實作
如果兩個字元串長度相等,字元串中每個字元的ASCII碼值均相同,則傳回0
【C語言學習】字元串操作函數(1)——————>strlen strcpy strcmp 詳解與手動實作
【C語言學習】字元串操作函數(1)——————>strlen strcpy strcmp 詳解與手動實作
【C語言學習】字元串操作函數(1)——————>strlen strcpy strcmp 詳解與手動實作

代碼如下:

int my_strcmp(const char*str1, const char*str2)
{
	assert(str1&&str2);
	while (*str1 == *str2 )
	{
		if (*str1 == *str2&&*str1=='\0')
		{
			return 0;
		}
		str1++;
		str2++;
	}
	return *str1 - *str2;
}
int main()
{
	char arr1[50];
	char arr2[50];
	int n = 0;
	gets(arr1);
	gets(arr2);
	int ret1=my_strcmp(arr1, arr2);
	if (ret1 == 0)
	{
		printf("倆字元串相同\n");
	}
	else if (ret1 > 0)
	{
		printf("字元串arr1大\n");
	}
	else
	{
		printf("字元串arr2大\n");
	}
	return 0;
}
           

繼續閱讀