模拟实现atoi,strncat,strncpy, 找单身狗

本文详细解析了两个 C 语言版本的模拟 atoi 函数,以及如何处理空指针、空字符串、非数字字符等边界情况。同时介绍了模拟 strncat 和 strncpy 的实现,以及寻找单身狗的算法。重点在于基础算法和字符串处理技巧。

#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;
}
 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值