strcpyの2. 1. 3. 4.はstrstr実装strchr 5. memcpyを7 MEMMOVEを達成するために実装のstrcmp 6を実装STRCATを達成達成達成します

strcpyのを達成するために1。

文字列の始まりをコピーし、SRCからDESTアドレスへのスタートにNULLターミネータを含むアドレス空間

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



char *mystrcpy(char *str2, const char *str1)
{
	assert(str1 != NULL);
	assert(str2 != NULL);

	char *r = str2;
	while ((*r++ = *str1++) != '\0');

	return r;
}

int main()
{
	char str1[] = "abcdef";
	char str2[] = { 0 };
	mystrcpy(str2, str1);
	strcpy(str2, str1);

	printf("%s\n", str2);
	printf("%s\n", str2);


	return 0;
}


2. strcatのを達成するために

Srcは、(オリジナルの「\ 0」の* destの末尾を削除)destが指す文字列にコピーされた(「\ 0」を含む)の文字列を指します。入ってくるコピーを収容するのに十分長い* DEST * SRCを確保するために。* SRC任意のオリジナルキャラクターそのまま。DESTのへのポインタを返しますポインタを

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

char *mystrcat(char *str2, const char *str1)
{
	assert(str1);
	assert(str2);
	char *r = str2;
	while (*str2 != '\0')
	{
		str2++;
	}

	while (*str2++ = *str1++);
	
	return str2;
}

int main()
{
	char str1[] = "def";
	char str2[] = "abc";
	mystrcat(str2, str1);
	strcat(str2, str1);

	printf("%s\n", str2);
	printf("%s\n", str2);


	return 0;
}


3.実装はstrstr

strstr(STR1、STR2)関数は、文字列はSTR1のSTR2のサブストリングであるかどうかを決定するために使用されます。もしそうであれば、関数はSTR1におけるSTR2の最初の発生のアドレスを返し、そうでなければNULLを返します。

#include <stdio.h>
#include <string.h>

char *mystrstr(const char *str1, const char *str2)
{
	char *cp = (char*)str1;
	char *s1, *s2;
	if (!*str2)
		return((char *)str1);
	while (*cp)
	{
		s1 = cp;
		s2 = (char *)str2;
		while (*s1 && *s2 && !(*s1 - *s2))
			s1++, s2++;
		if (!*s2)
			return(cp);
		cp++;
	}
	return(NULL);
}

int main()
{
	char str1[] = "1234xyz";
	char str2[] = "34";
	printf("%s\n", mystrstr(str1, str2));
	printf("%s\n", strstr(str1, str2));


	return 0;
}


4. strchrを実装

与えられた文字列に一致するものを見つけるための最初の場所として機能的能力をstrchr。関数のプロトタイプ:するchar * strchr(定数するchar * strの、int型のC)、すなわち、最初の検索文字Cは、引数strで指された文字列の最初の位置に(unsigned char型)が表示されます。

#include <stdio.h>
#include <string.h>


char *mystrchr(const char *str, int c)
{
	while (*str != '\0' && *str!= c)
	{
		++str;
	}
	return (*str == c )? str : NULL;
}


int main()
{
	char str[] = "abcdefd";
	char c = 'd';
	printf("%s\n", mystrchr(str, c));
	printf("%s\n", strchr(str, c));


	return 0;
}


5.にstrcmpを実装

strcpyのは、C言語のstrcpyあって、標準ライブラリ関数「\ 0」は、の文字列の他端にコピーしたアドレス空間を、戻り値の型はchar *型です。

#include <stdio.h>
#include <string.h>
#include <assert.h>

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


int main()
{
	char str1[] = "abcdefd";
	char str2[] = "abcd";
	printf("%d\n", mystrcmp(str1, str2));
	printf("%d\n", strcmp(str1, str2));


	return 0;
}


6.のmemcpyを実装

memcpyのメモリコピー機能は、C ++やC、関数プロトタイプvoid *とのmemcpy(ボイド*デス、ボイド*ソース、符号なしN)の使用を指す;関数は、ソース・メモリ・アドレスを複数バイトのコピーを開始するための開始位置から関数でありますターゲットメモリアドレス、すなわち、ターゲットデスにソースからコピー元nバイト。

#include <stdio.h>
#include <string.h>
#include <assert.h>

void *mymemcpy(void * dst, const void * src, size_t count)
{
	void * ret = dst;
	assert(dst);
	assert(src);
	while (count--)
	{
		*(char *)dst = *(char *)src;
		dst = (char *)dst + 1;
		src = (char *)src + 1;
	}

	return(ret);
}
	

int main()
{
	const char *s1 = "hello";
	int a = sizeof(s1);
	char s2[1024]= { 0 };
	mymemcpy(s2, s1, strlen(s1));
	printf("%s\n", s2);
	memcpy(s2, s1, strlen(s1));
	printf("%s\n", s2);	

	return 0;
}


7. MEMMOVEを達成

覆われる前に、ターゲット領域にコピー元の文字列MEMMOVE重複バイトの領域でなく、コピー元の内容が変更された後を確実にするために、次に、ターゲット領域とソース領域が重なる場合、バイトをコピーするためMEMMOVE。しかし、ターゲット領域とソース領域とが同じ関数memcpy関数と重なっていない場合。

#include <stdio.h>
#include <string.h>
#include <assert.h>



void *mymemmove(void * dst, const void * src, size_t count)
{
	void * ret = dst;

	if (dst <= src || (char *)dst >= ((char *)src + count))
	{
		while (count--)
		{
			*(char *)dst = *(char *)src;
			dst = (char *)dst + 1;
			src = (char *)src + 1;
		}
	}
	else
	{
		dst = (char *)dst + count - 1;
		src = (char *)src + count - 1;
		while (count--)
		{
			*(char *)dst = *(char *)src;
			dst = (char *)dst - 1;
			src = (char *)src - 1;
		}
	}

	return(ret);
}


int main()
{
	char buffer1[] = "abcdef";
	char buffer2[] = "ddadfg";

	mymemmove(buffer1, buffer2, sizeof(buffer1));
	printf("%s\n", buffer1);
	memmove(buffer1, buffer2, sizeof(buffer1));
	printf("%s\n", buffer1);

	return 0;
}

 

おすすめ

転載: blog.csdn.net/qq_43210641/article/details/94744683