面试题留痕

1,atoi函数的书写

#include<stdio.h>
#include <ctype.h>   // for isspace,isdigit //isspace用来跳过空白字符//isdigit用来确认是否为数字
#include <limits.h>  // for INT_MAX, INT_MIN 

/*程序健壮性的问题
1.是否输入字符
2.空白字符的判断
3.判断符号
4.对非数字进行筛选
5.超过有符号整型大小的数值,进行判断。
*/

int my_atoi(const char *str)
{
    if (str == NULL)
    {
        return 0;
    }

    while(*str == ' ')//对于空白符号的检测使用isspace函数更佳   while(isspace((unsigned char)*str)){ str++; }
    {
        str++;
    }

    int sign = 1;
    if (*str == '+' || *str == '-')
    {
        if (*str == '-')
        {
            sign = -1;
        }
        str++;
    }

    int result = 0;
    while (*str >= '0' && *str <= '9')//对于数字进行了判断,使用ctype.h中的isdigit函数会更好 while(isdigit((unsigedchar)*str)) {  }
    {
        int digit = *str - '0';
        if (result > INT_MAX/10)
        {
            printf("超过字节存储空间\n");
        }
        result = result * 10 + digit;
        str++;
    }

    return sign * result;
    

    
    
}
int main()
{
    printf("%d\n",my_atoi("   -12328"));
    return 0;
}

2.编写类似strcpy函数的实现,函数原型: char *strcpy(char *strDest, const char *strSrc);

#include<stdio.h>
#include<assert.h>
//将strSrc中的字符串拷贝到strDest
char *strcpy(char *strDest, const char *strSrc)
{ 
     if(strDest == NULL || strSrc == NULL) //判断传参的正确性 
     {
        return NULL;
     }
     char *address = strDest;                       //保存目标字符串首地址用于函数返回
     while((*strDest++ = *strSrc++) != '\0');       // 拷贝字符串  
     return address;                                //返回目标串首地址,目的是实现链式表达式
}
int main()
{
    char dest[50];
    const char *src = "12345";
    printf("%s\n",strcpy(dest,src));
}

3.判断大端字节序与小端字节序

3.1使用指针判断

#include<stdio.h>


int main()
{
    unsigned int num = 0x12345678;
    char *p = (char *)&num;

    if (*p == 0x12)
    {
        printf("大端字节序");
    }
    else
    {
        printf("小端字节序");
    }
    
}

3.2使用联合体判断(unsigned int 是四个字节,而char是一个字节,因为第一个字节为低地址,而联合体成员共用一个内存,通过char来获取低地址的数据)

#include<stdio.h>


union 
{
    int num;
    char c;
}endian;
int main()
{
    union endian;
    endian.num = 0x12345678;
    if (endian.c == 0x12)
    {
        printf("大端");
    }
    else
    {
        printf("小端");
    }
    
}

4.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值