日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言詳細講解strcpy?strcat?strcmp函數的模擬實現_C 語言

作者:菜菜不恰菜 ? 更新時間: 2022-07-01 編程語言

一、模擬實現strcpy函數

strcpy函數是字符串拷貝函數,就是將源字符串拷貝到目標空間中。

char * strcpy ( char * destination, const char * source );//庫函數中的聲明

將源(source)指向的c字符串復制到目標(destination)指向的數組中,包括終止的空字符(并在該點停止)。

為避免溢出,目標(destination)指向的數組的大小應足夠長,以包含與源相同的C字符串(包括終止的空字符),并且在內存中不應與源重疊。

在這里需要注意:

1、源字符串必須以 '\0' 結束。

2、會將源字符串中的 '\0' 拷貝到目標空間。

3、目標空間必須足夠大,以確保能存放源字符串。

4、目標空間必須可變。

下面就用my_strcpy來模擬實現stcpy函數。

#include <stdio.h>
#include <assert.h>//assert的頭文件
char* my_strcpy(char* dest,const char* src)//這里用const修飾所指向的源字符串,因為源字符串是
                                           //常量字符串,不能被修改
{
    char* ret = dest;
	assert(dest);//斷言源字符串和目標空間都不能為空指針
	assert(src);
	while (*dest++ = *src++)//一個字符串一個字符串的拷貝,遇到'\0'結束
	{
		;
	}
   return ret;//返回目標空間的起始地址
}
int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "hello";
	printf("%s", my_strcnpy(arr1, arr2));
	return 0;
}

以上是整個字符串的拷貝,如果我們不拷貝整個字符串,只拷貝字符串里面的幾個字符,我們可以怎么做呢?接下來我們來看看strncpy這個函數,這個函數可以實現只拷貝字符串里面的幾個字符。這個函數的模擬實現大體上跟strcpy函數是一樣的,只是這里有了長度限制,接下來用my_strncpy來模擬實現。

#include <stdio.h>
#include <assert.h>
char* my_strcnpy(char* dest, const char* src, size_t n)
{
	char* ret = dest;
	assert(dest);
	assert(src);
	int i = 0;
	for (i = 0; i < n; i++)//要拷貝幾個字符,循環幾次
	{
		*dest++ = *src++;
	}
	return ret;
}
int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "hello";
	printf("%s", my_strcnpy(arr1, arr2, 3));//3就是我們要拷貝的字符串的大小,這里就相當于將前三個字符hel進行拷貝(這里也可以將整個字符串拷貝,只要知道大小)
	return 0;
}

二、模擬實現strcat函數

strcat是連接字符串函數,它的作用是將源字符串附加到目標字符串。目標中終止的空字符被源字符串中的第一個字符覆蓋,空字符包含在由目標中的兩個字符串聯而成的新字符串的末尾。

char * strcat ( char * destination, const char * source );//庫函數中的聲明

在這里需要注意:

1、源字符串必須以 '\0' 結束,目的地也必須以 '\0' 結束

2、目標空間必須有足夠的大,能容納下源字符串的內容。

3、目標空間必須可修改。

下面就用my_strcat來模擬實現strcat函數。

#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, const char* src)這里用const修飾所指向的源字符串,因為源字符串是
                                           //常量字符串,不能被修改
{
	char* ret = dest;
	assert(dest);
	assert(src);
	while (*dest != '\0')\\找到目標空間的結束標志處,然后開始連接
	{
		dest++;
	}
	while (*dest++ = *src++)
	{
		;
	}
	return ret;//返回目標空間的起始地址
}
int main()
{
	char arr1[20] = "abc";
	char arr2[] = "def";
	printf("%s\n", my_strncat(arr1, arr2));
	return 0;
}

對于字符串連接還有一個函數strncat也能描述,但是這個函數是有長度限制的,可以連接一個字符串里面的幾個字符或者整個字符串。下面就用my_strncat來模擬實現strcat函數。

#include <stdio.h>
#include <assert.h>
char* my_strncat(char* dest, const char* src,size_t n)
{
	char* ret = dest;
	assert(dest);
	assert(src);
	int i = 0;
	while (*dest != '\0')\\找到目標空間的結束標志處,然后開始連接
	{
		dest++;
	}
	for (i = 0; i < n; i++)//要連接幾個字符,循環幾次
	{
		*dest++ = *src++;
	}
	return ret;//返回目標空間的起始地址
}
int main()
{
	char arr1[20] = "abc";
	char arr2[] = "def";
	printf("%s\n", my_strncat(arr1, arr2, 2));//需要連接幾個字符串,就將它們的大小傳過去,這里這里的2就是字符串里面"de"的大小,將"de"兩個字符傳過去
	return 0;
}

三、模擬實現strcmp函數

strcmp是字符串比較函數,比較兩個字符串str1和str2,此函數開始比較每個字符串的第一個字符。如果它們彼此相等,則繼續往下比,直到字符不同或到達終止的空字符。

int strcmp ( const char * str1, const char * str2 );//庫函數中的聲明

第一個字符串大于第二個字符串,則返回大于0的數字

第一個字符串等于第二個字符串,則返回0

第一個字符串小于第二個字符串,則返回小于0的數字

下面用my_strcmp來模擬實現strcmp函數:

#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1);
	assert(str2);
	while (*str1 == *str2)//先看首字符如果這兩個字符是否相等,如果相等繼續往下比,不相等跳出去比較大小
	{
		if (*str1 == '\0')//判斷是否已經比完了所有字符,如果已經比完了返回0,說明這兩個字符串相等
		{
			return 0;
		}
		else//如果沒有比完,繼續往下一個比
		{
			str1++;
			str2++;
		}
	} 
	//如果兩個字符不相等,那就比大小,返回大于0的數則說明str1>str2,反之小于。
	return *str1 - *str2;
}
int main()
{
	char arr1[20] = "abcefg";
	char arr2[] = "efghij";
	int ret = my_strcmp(arr1, arr2);
	if (ret > 0)
	{
		printf("大于\n");
	}
	else if (ret < 0)
	{
		printf("小于\n");
	}
	else
	{
		printf("等于\n");
	}
	return 0;
}

有長度限制的比較函數strncmp,下面用my_strncmp模擬實現:

#include <stdio.h>
#include <assert.h>
int my_strncmp(const char* str1, const char* str2,int n)
{
	int i = 0;
	for (i = 0; i < n; i++)//需要比較幾個字符循環幾次
	{
		if (*(str1 + i) == *(str2 + i))//先看首字符如果這兩個字符是否相等,如果相等繼續往下比,不相等跳出去比較大小
		{
			if (*str1 == '\0')//判斷是否已經比完了所有字符,如果已經比完了返回0,說明這兩個字符串相等
			{
				return 0;
			}
			else//如果沒有比完,繼續往下一個比
				str1++;
				str2++;
		}
//如果兩個字符不相等,那就比大小,返回大于0的數則說明str1>str2,反之小于。
		return *str1-*str2;
	}
}
int main()
{
	char arr1[20] = "abcefg";
	char arr2[] = "efghij";
	int ret = my_strncmp(arr1, arr2,2);
	if (ret > 0)
	{
		printf("大于\n");
	}
	else if (ret < 0)
	{
		printf("小于\n");
	}
	else
	{
		printf("等于\n");
	}
	return 0;
}

四、小結

以上就是字符串的庫函數的模擬實現。主要講了一種是長度不受限制的字符串函數(strcpy,strcat,strcmp),一種是長度受限制(strncpy,strncat,strncmp)的字符串函數。

原文鏈接:https://blog.csdn.net/m0_65673419/article/details/124084093

欄目分類
最近更新