1. 程式人生 > >【C語言】模擬實現strcpy strcat strstr strcmp

【C語言】模擬實現strcpy strcat strstr strcmp

模擬實現strcpy(字串拷貝)

這道題,是將原字串的內容拷貝到目標字串中去,一個字元一個字元的拷貝直到遇到 ‘\0’ ,將它也拷貝過去後停止。 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>

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

int  main()
{
	char a[] = "abc";
	char b[] = "bcd";
	my_strcpy(b,a);
	printf("%s\n", b);
	system("pause");
	return 0;
}

模擬實現strcat (字串連結)

這道題與strcpy相似,不過是先找到目標字串的 ‘\0’ ,然後在其後邊拷貝原字串的內容,直至 ‘\0’ 也拷貝完成則結束。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>

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

int main()
{
	char a[] = "abc";
	char b[] = "bcd";
	my_strcpy(b, a);
	printf("%s\n", b);
	system("pause");
	return 0;
}

模擬實現strstr(在一個字串中找另一個字串第一次出現的位置) 

這道題在一個字串中查詢一個子字串,我們需要不斷地對比查詢,設字串為str,子字串為substr,我們需要將substr中的每一個字元與str中對比查詢。 
1.若字元連續相等,並且substr遇到‘\0’,說明已經查詢完成,此時返回起始匹配的字元地址即可 
2.若字元連續相等,但是str遇到‘\0’,此時說明把str都查詢完了,但是還是沒有查詢到substr,此時返回空指標即可 
3.若匹配中途失敗,則需要把起始位置變為第一個字元匹配的後一個。如在abbbcd中查詢bbc,第一次遇到b時,匹配仍然會失敗,此時令子字串回到起始位置,但是原字串的起始位置變成第二個b的位置即可。 
注:用cur記錄str中開始匹配時的字元的地址,若匹配中途失敗,則cur++。

 

  #define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>

char* my_strstr(const char *str, char *substr)
{
	assert(str);
	const char *s1 = str;
	const char *s2 = substr;
	const char *cur = str;
	while (*cur)
	{
		s1 = cur;
		s2 = substr;
		while (*s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
			return cur;
		if (*s1 == '\0')
			return NULL;
		cur++;
	}
	return NULL;
}

int main()
{
	char *p = "abcdefg";
	char *q = "bcd";
	char *ret = my_strstr(p,q);
	printf("%s\n", ret);
	system("pause");
	return 0;
}

模擬實現strcmp(字串比較)

這道題關鍵在於比較的方式,兩個字串是一個個對應字元進行比較的,若相等則返回0,第一個大則返回大於 0 的數字,第二個大則返回小於 0 的數字。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>

int my_strcmp(const char* str1, const char *str2)
{
	assert(str1);
	assert(str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	if (*str1 > *str2)
		return 1;
	else
		return -1;//return *str1-*str2;

}

int main()
{
	char *p1 = "abcd";
	char *p2 = "aaaa";
	int ret =my_strcmp(p1, p2);
	printf("%d\n\n",ret);
	system("pause");
	return 0;
}