一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
编写一个函数找出这两个只出现一次的数字。
#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;
}
函数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;
}
函数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;
}