嵌入式工程师常见C语言手写面试题,摘录于RTT内核源码

memset()函数原型是extern void *memset(void *buffer, int c, int count)      

头文件:#include <string.h> 

buffer:为指针或是数组,

c:是赋给buffer的值,

count:是buffer的长度

一般用来进行初始化,memset可以方便的清空一个结构类型的变量或数组

不建议用来干别的。。。。。。因为。。。。。。。哈哈你试下就知道

memset是一个字节一个字节的设置,所以你想设置为1的时候,你就会得到0x01010101

void *memset(void *s, int c, rt_ubase_t count)
{
    char *xs = (char *)s;

    while (count--)
        *xs++ = c;

    return s;
}

更加详细的memset使用可以跳到这个大兄弟的博客:  https://blog.csdn.net/qq_27522735/article/details/53374765

 

原型:extern void *memcpy(void *dest, void *src, unsigned int count);

头文件:#include <string.h>

功能:由src所指内存区域复制count个字节到dest所指内存区域。

说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。

有一点要注意的事判断源地址和目的地址的大小,才决定到底是从高地址开始拷贝还是低地址开始拷贝

void *memcpy(void *dst, const void *src, int count)
{
    char *tmp = (char *)dst, *s = (char *)src;
    int len;

    if (tmp <= s || tmp > (s + count))
    {
        while (count--)
            *tmp ++ = *s ++;
    }
    else
    {
        for (len = count; len > 0; len --)
            tmp[len - 1] = s[len - 1];
    }

    return dst;
}

更加详细的memset使用可以跳到这个大兄弟的博客:https://blog.csdn.net/qq_35040828/article/details/71123521

 

 

原型:extern void *memmove(void *dest, const void *src, unsigned int count);

用法:#include <string.h>

功能:由src所指内存区域复制count个字节到dest所指内存区域。

说明:src和dest所指内存区域可以重叠。

void *memmove(void *dest, const void *src, rt_ubase_t n)
{
    char *tmp = (char *)dest, *s = (char *)src;

    if (s < tmp && tmp < s + n)
    {
        tmp += n;
        s += n;

        while (n--)
            *(--tmp) = *(--s);
    }
    else
    {
        while (n--)
            *tmp++ = *s++;
    }

    return dest;
}

更加详细的memset使用可以跳到这个大兄弟的博客:https://blog.csdn.net/zgaoq/article/details/54586049

 

 

原型:extern int memcmp(void *buf1, void *buf2, unsigned int count);
用法:#include <string.h>  
功能:比较内存区域buf1和buf2的前count个字节。
说明:当buf1<buf2时,返回值<0当buf1=buf2时,返回值=0当buf1>buf2时,返回值>0
int memcmp(const void *cs, const void *ct, int count)
{
    const unsigned char *su1, *su2;
    int res = 0;

    for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
        if ((res = *su1 - *su2) != 0)
            break;

    return res;
}

 

原型:extern int strnlen(const char *s, int maxlen)
用法:#include <string.h>  
 功能:获取s的长度,指定maxlen。
 说明:返回长度。

int strnlen(const char *s, int maxlen)
{
    const char *sc;

    for (sc = s; *sc != '\0' && sc - s < maxlen; ++sc) /* nothing */
        ;

    return sc - s;
}

 

同上

int strlen(const char *s)
{
    const char *sc;

    for (sc = s; *sc != '\0'; ++sc) /* nothing */
        ;

    return sc - s;
}

 

原型:char *strstr(const char *s1, const char *s2)
用法:#include <string.h>  
 功能:功能就是找出在字符串str1中第一次出项字符串str2的位置(也就是说字符串sr1中要包含有字符串str2)
 说明:找到就返回该字符串位置的指针(也就是返回字符串str2在字符串str1中的地址的位置),找不到就返回空指针(就是 null)
char *strstr(const char *s1, const char *s2)
{
    int l1, l2;

    l2 = strlen(s2);
    if (!l2)
        return (char *)s1;
    l1 = strlen(s1);
    while (l1 >= l2)
    {
        l1 --;
        if (!memcmp(s1, s2, l2))
            return (char *)s1;
        s1 ++;
    }

    return NULL;
}

更加详细的memset使用可以跳到这个大兄弟的博客:https://blog.csdn.net/u013298384/article/details/24839727

 

原型:long atoi(const char *str)
用法:#include <string.h>  
功能:把字符串转换成数字
说明:不是rtt的内核源码
long atoi(const char *str)
{
    long res = 0;
    while(*str >= '0' && *str <= '9')
    {
        res = res*10 + *str -'\0';
        str++;
    } 
    return res;
}

更加详细的memset使用可以跳到这个大兄弟的博客:https://blog.csdn.net/gettogetto/article/details/49708419

 

上面的代码可以到这里下载:https://download.csdn.net/download/weixin_38452632/10677930

rtt的内核源码可以到这里下载:https://www.rt-thread.org/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值