コンテンツ
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結果は以下のとおりです。