#define _CRT_SECURE_NO_WARNINGS 1
//版本一
//模拟实现atoi
#include <stdio.h>
#include <limits.h>
#include <assert.h>
#include <stdlib.h>
#include <ctype.h>
enum State
{
VALID, //0
INVALID //1
};
enum State state = VALID;//枚举类型变量定义和初始化一般是以全局变量定义和初始化的,并且设state默认为合法VALID
int my_atoi(char* str)
{
state = INVALID;
assert(str);
long long ret = 0;
int flag = 0;
//跳过空格
while (isspace(*str))
{
str++;
}
//如果遇到\0提前自动结束
if (*str=='\0')
return 0;
//遇到正负号会跳过,并记录下来
if (*str == '+')
{
flag = 1;
str++;
}
else if ('-')
{
flag = -1;
str++;
}
//开始将数字字符转变为数字
while (isdigit(*str))
{
ret = flag* ( * str - '0') + ret * 10;
if (ret< INT_MIN)
{
return INT_MIN;
}
else if(ret>INT_MAX)
{
return INT_MAX;
}
str++;
}
//返回结果
if (*str == '\0')
{
state = VALID;//遇到\0自动结束的为合法的结束
return (int) ret;
}
else //遇到\0之外的非数字字符,不是正常结束
return (int) ret;
}
int main()
{
char* str = NULL;
scanf("%s", str);
int n= my_atoi(str);
printf("%s %d", str, n);
return 0;
}
//版本二
//模拟实现atoi
//int my_atoi(const char* str)
//{
// int n = 0;
// while (*str)
// {
// n = n * 10 + *str-'0';//'3'-'0'==>51-48 = 3
// str++;
// }
// return n;
//}
//空指针
//空字符串
//非数字字符
//前面有空白字符
//前面有+-
//溢出
//
//#include <assert.h>
//#include <ctype.h>
//
//enum Status
//{
// VALID,
// INVALID
//}status = INVALID;//非法
//
//int my_atoi(const char* str)
//{
// int flag = 1;
// //空指针
// assert(str);
//
// //字符串为空
// if (*str == '\0')
// {
// return 0;
// }
// //空白字符
// while(isspace(*str))
// {
// str++;
// }
// //正负号
// if (*str == '+')
// {
// flag = 1;
// str++;
// }
// else if (*str == '-')
// {
// flag = -1;
// str++;
// }
//
// long long n = 0;
// while (*str != '\0')
// {
// if (isdigit(*str))
// {
// n = n * 10 + flag * (*str - '0');
// if (n < INT_MIN)
// {
// n = INT_MIN;
// break;
// }
// else
// {
// n = INT_MAX;
// break;
// }
// }
// else
// {
// break;
// }
// str++;
// }
// if (*str == '\0')
// {
// status = VALID;
// }
//
// return (int)n;
//}
//
//int main()
//{
// char arr[100] = "11111111111111111111111111";
// int ret = my_atoi(arr);
// if(status == VALID)
// printf("正常转化:%d\n", ret);
// else
// printf("非法转化:%d\n", ret);
// return 0;
//}
//
//模拟实现strncat
char *my_strncat(char* str1,const char *str2,int nums)
{
int i = 0;
char* p = str1;
while (*str1)//为找到字符串最后的\0,以他作为追加的开始位置
{
str1++;
}
for (i = 0; i < nums; i++)
{
*str1++ = *str2++;
}
*++str1 = '\0';
return p;
}
#include <stdio.h>
int main()
{
char str1[20] = "hello ";
char str2[] = "world";
int nums = 0;
scanf("%d", &nums);
printf("%s", my_strncat(str1, str2, nums));
return 0;
}
//模拟实现strncpy
#include <stdio.h>
char* my_strncpy(char* dest, char* rsc, int nums)
{
char* p = dest;
int i = 0;
for (i = 0; i < nums; i++)
{
*dest++ = *rsc++;
}
return p;
}
int main()
{
char str1[20] = "hello world";
char str2[] = "create";
int nums = 0;
scanf("%d", &nums);
printf("%s",my_strncpy(str1, str2, nums));
return 0;
}
//找一只单身狗
//全部异或^
//找两只单身狗
#include <stdio.h>
void find_Single_Dog(int* p,int sz)
{
int i =0,j= 0;
int ret = 0;
int num1 = 0;
int num2 = 0;
for (i = 0; i < sz; i++)
{
ret ^= *(p + i);
}
for (i = 0; i < 32; i++)
{
if (((ret >> i) & 1)==1)
{
j = i;
break;
}
}
for (i = 0; i < sz; i++)
{
if (((*p >> j) & 1) ==1)
{
num1 ^=*p;
}
else if (((*p >> j) & 1) ==0)
{
num2 ^= *p;
}
p++;
}
printf("单身狗是:%d %d", num1,ret^num1);
}
int main()
{
int arr[10] = { 1,1,2,2,3,3,4,5,5,6 };
int sz = sizeof(arr) / sizeof(arr[0]);
find_Single_Dog(arr,sz);
return 0;
}
本文详细解析了两个 C 语言版本的模拟 atoi 函数,以及如何处理空指针、空字符串、非数字字符等边界情况。同时介绍了模拟 strncat 和 strncpy 的实现,以及寻找单身狗的算法。重点在于基础算法和字符串处理技巧。
123

被折叠的 条评论
为什么被折叠?



