关于strncat和strncpy和atoi函数的代码实现外加寻找单身狗代码实现

这篇博客介绍了如何使用C语言找出数组中仅出现一次的两个数字。通过异或操作,首先获取分组依据,然后对数组进行分组异或,最终得到两个只出现一次的数字。此外,还展示了`strncpy`、`strncat`和`atoi`函数的自定义实现,分别用于字符串的安全复制、追加和数字字符转整数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。

编写一个函数找出这两个只出现一次的数字。

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

void Find_single_dog(int arr[], int sz, int* dog1, int* dog2)
{
	int i = 0;
	int ret = 0;
//先异或整个数组,来得到我们进行分组的判断条件
	for (i; i < sz; i++)
	{
		ret ^= arr[i];
	}
	int pos = 0;
//ret异或整个数组后得到的数,判断第几位是1,以此来做分组的判断条件
	for (pos; pos < 32; pos++)
	{
		if (((ret >> pos) & 1) == 1)
		{
			break;
		}
	}
	for (i = 0; i < sz; i++)
	{
//有了pos的判断条件,我们就可以分组进行异或
		if (((arr[i] >> pos) & 1) == 1)
		{
			*dog1 ^= arr[i];
		}
		else
		{
			*dog2 ^= arr[i];
		}
	}
}
int main()
{
//两个相同的数异或就会是0,所以,我们通过把两个只出现一次的数进行分组,再创建两个数分别异或这两个组,来得到只出现一次的数
	int arr[] = { 1,3,4,6,7,9,1,3,4,6,7,8 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int dog1 = 0;
	int dog2 = 0;
	Find_single_dog(arr, sz, &dog1, &dog2);
	printf("%d %d", dog1, dog2);
	return 0;
}

6cdf9bdeb5bc4a7a8d6ff462f1fd932e.png

 函数strncpy代码原型是

char * strncpy ( char * destination, const char * source, size_t num );

跟strcpy相比就是多了判断要复制几个字节,把source指针,所指向的数据,复制num个字节到destination

代码模拟实现:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#onclude <assert.h>
void my_strncpy(char* p1,const char* p2, int sz)
{
    assert(p2);
	for (int i = 0; i < sz; i++)
	{
		*(p2+i) = *(p1 + i);
	}
}
int main()
{
	char arr1[] = "abcdefg";
	char arr2[20] = { 0 };
	my_strncpy(arr2, arr1, sizeof(arr1) / sizeof(arr1[1]));
	printf("%s", arr2);
	return 0;
}

函数strncat的原型是:

char * strncat ( char * destination, const char * source, size_t num );

代码功能是,把surce所指向的数据,追加到destination的‘’位置,追加num个字符后,在结尾添加一个''

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

char* My_strncat(char* p1, const char* p2, int n)
{
	assert(p1 && p2);
	char* p = p1;
	while (*p1)
	{
		p1++;
	}
	for (int i = 0; i < n; i++)
	{
		*p1++ = *p2++;
	}
	p1++;
	*p1 = "";
	return p;
}
int main()
{
	char arr1[20] = "0";
	char arr2[20] = "abckefg";
	My_strncat(arr1, arr2, 5);
	printf("%s
", arr1);
	return 0;
}

3158f328d1774db7bf1113dc9460724c.png

 

函数atoi的原型是:

int atoi (const char * str);

代码功能是,把数字字符,转换成整数返回,如果遇到不是数字字符的话,中断转换,返回已转换的整数

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <ctype.h>
#include <limits.h>
enum sta
{
	INVALID,
	VALID,
}sta= INVALID;//默认设置为非法转换

int my_atoi(const char* str)
{
	int flag = 1;
	long long ret = 0;
	//如果传过来的参数是空字符或是只有一个,直接返回一个零,判断为非法转换
	if (str == '')
	{
		return 0;
	}
	//跳过空格
	while (str == ' ')
	{
		str++;
	}
	//创建一个flag来判断是正负
	if (*str == '+')
	{
		flag = 1;
		str++;
	}
	else if(*str=='-')
	{
		flag = -1;
		str++;
	}
	while (*str)
	{
		//isdigit可以判断是否是数字字符
		if (isdigit(*str))
		{
			ret = ret * 10 + flag* (*str - '0');
			//判断越界
			if (ret > INT_MAX || ret < INT_MIN)
			{
				return 0;
			}

		}
		//如果传过来的参数有不是数字字符的,直接返回已转换的整数
		else
		{
			return (int)ret;
		}
		*str++;
	}
	//传过来的参数,都转换完成了,把sta置为合法转换
	if (*str == '')
	{
		sta = VALID;
	}
	return (int)ret;
}

int main()
{
	char arr[20] = "-123s456";
	int ret = my_atoi(arr);
	if (sta == INVALID)
	{
		printf("非法返回:%d
", ret);
	}
	else
	{
		printf("合理转换:%d
", ret);
	}
	return 0;
}

15b73c0c06d24419baef7c4f9733fa31.png

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值