C言語関数シミュレーションの実装

コンテンツ

1.strncatの実装をシミュレートします

1.1コードの記述 

1.2結果は以下のとおりです

2.strncpyをシミュレートします

2.1コードの記述

2.2結果は以下のとおりです。

3.1匹の犬を探す

3.1コードの記述

3.2結果は以下のとおりです。


 

1.strncatの実装をシミュレートします


システムライブラリ関数の中には、文字列を追加する、つまり文字列の後に文字列を追加するために使用されるstrncat関数があります。その関数プロトタイプは次のとおりです。

char *strncat(char *strDest,const *strSource,size_t count);

*strDestはターゲット文字列です*strSourceはソース文字列、countは追加される文字列の数です。

1.1コードの記述 

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef unsigned int uint;
char *my_strncat(char *dest, const char *src, uint count)//模拟实现strncat函数
{
 assert(dest);
 assert(src);
 int *ret = dest;
 while (*dest)
 {
  dest++; //找到dest中的\0
 }
 while (count--)
 {
  *dest++ = *src++;
 }
 *dest = '\0';
 return ret;
}
//程序测试
int main()
{
 char arr[20] = "abcdef";
 int len = strlen(arr);
 my_strncat(arr, arr, len);
 printf("%s\n", arr);
 system("pause");
 return 0;
}

1.2結果は以下のとおりです

 


 

2.strncpyをシミュレートします

char *strncpy(char *strDest,const *strSource,size_t count);

*strDestはターゲット文字列です*strSourceはソース文字列、countはソース文字列からターゲット文字列にコピーする必要のある文字数です。 

注:ソース文字列の長さがカウントより短い場合は、ソース文字列をコピーした後、カウントが次のようになるまで、ターゲット文字列に0を追加します。

2.1コードの記述

char * My_strncpy(char * dest, const char *src, size_t n)
{
    assert(dest);
    assert(src);

    char *ret = dest;
    while (n--)
    {
        *dest++ = *src++;
    }
    return ret;
}
int main()
{
    char str1[20] = "123456789";
    char str2[20] = "abcde";
    printf("%s", My_strncpy(str1, str2, 3));

}

2.2結果は以下のとおりです。

3.1匹の犬を探す

配列内の2つの数字だけが一度だけ表示され、他のすべての数字は2回表示されます。

1回だけ発生するこれら2つの数値を見つける関数を記述します。

3.1コードの記述

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>
void find_two_diff_num(int arr[], int sz, int *p1, int *p2)
{
	int i = 0;//循环变量
	int ret = 0;
	int pos = 0;
	*p1 = 0;//数字1的地址
	*p2 = 0;//数字2 的地址
	//1.把所有数字异或 
	for (i = 0; i < sz; i++)
	{
		ret ^= arr[i];//循环到最后一次的结果是5^6,即就是101^110=011
	}
	//2.找ret二进制中为1的一位
	for (i = 0; i < 32; i++)
	{
		if (((ret >> i) & 1) == 1)//上一步两个数异或的后两位为1
		{
			pos = i;
			break;
		}
	}
	//分组
	for (i = 0; i < sz; i++)
	{
		if (((arr[i] >> pos) & 1) == 1)
		{
			(*p1) ^= arr[i];
		}
	}
	(*p2) = (*p1) ^ ret;
}


int main()
{
	int arr[] = { 1, 2, 5, 6, 8, 1, 6, 2, 9, 8 };
	int sz = sizeof(arr) / sizeof(arr[0]);//数组大小
	int num1 = 0;//数字1
	int num2 = 0;//数字2
	find_two_diff_num(arr, sz, &num1, &num2);
	printf("num1=%d,num2=%d\n", num1, num2);
	system("pause");
	return 0;
}

3.2結果は以下のとおりです。

 

おすすめ

転載: blog.csdn.net/weixin_53939785/article/details/124062080