2016 C语言面试题——字符串函数的实现

2016 C语言面试题——字符串函数

前言:最近准备找工作了,所以需要做一些准备。先从基本的字符串函数的实现开始。如果有发现什么问题或有什么疑惑,请及时评论。

strcat

/*************************************************************************
    > File Name: strcat.c
    > Author: AnSwEr
    > Mail: 1045837697@qq.com
    > Created Time: 2015年10月07日 星期三 20时08分29秒
 ************************************************************************/

/*
 * 连接字符串
 */

#include<stdio.h>

char *my_strcat(char *dest,const char *src)
{
    char *temp = dest;
    const char *s = src;

    while(*temp != '\0')
        temp++;

    while((*(temp++) = *(s++)) != '\0');

    temp = '\0';

    return dest;
}

int main(void)
{
    char dest[] = "he";
    const char src[] = "llo";

    printf("%s\n",my_strcat(dest,src));

    return 0;
}

strchr

/*************************************************************************
    > File Name: strchr.c
    > Author: AnSwEr
    > Mail: 1045837697@qq.com
    > Created Time: 2015年10月07日 星期三 19时55分12秒
 ************************************************************************/

/*
 * 查找字符串中字符c第一次出现的位置
 */

#include<stdio.h>
#include<assert.h>

char *my_strchr(const char *str,int c)
{
    assert(str);

    const char *p = str;

    while(*p)
    {
        if(*p == c)
        {
            return p;
        }
        p++;
    }

    return NULL;
}

int main(void)
{
    char str[] = "abcd";

    printf("%c\n",*my_strchr(str,'b'));

    return 0;
}

strlen

/*************************************************************************
    > File Name: strlen.c
    > Author: AnSwEr
    > Mail: 1045837697@qq.com
    > Created Time: 2015年08月15日 星期六 16时24分06秒
 ************************************************************************/

/*
 *strlen的实现
 */

#include<stdio.h>

unsigned int my_strlen(const char * str)
{
    const char *tmp = str;
    int i;

    for(i=0;*tmp++ != '\0';i++);

    return i;
}

int main(void)
{
    char string[]= "answer";

    printf("%d\n",my_strlen(string));

    return 0;
}

strcpy

/*************************************************************************
    > File Name: strcpy.c
    > Author: AnSwEr
    > Mail: 1045837697@qq.com
    > Created Time: 2015年10月07日 星期三 16时11分34秒
 ************************************************************************/

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>

char *my_strcpy(char *dest,const char *src)
{
    if(dest == src)
    {
        return dest;
    }

    assert(dest != NULL);
    assert(src != NULL);

    char *temp = dest;

    while((*(dest++) = *(src++)) != '\0');

    return temp;
}

int main(void)
{
    const char src[] = "answer nihao";
    char *dest = (char *)malloc(sizeof(src));

    printf("%s\n",my_strcpy(dest,src));

    return 0;
}

memcpy

/*************************************************************************
    > File Name: memcpy.c
    > Author: AnSwEr
    > Mail: 1045837697@qq.com
    > Created Time: 2015年10月07日 星期三 16时20分44秒
 ************************************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

void *my_memcpy(void *dest,const void *src,size_t n)
{
    if(n <= 0)
    {
        return NULL;
    }

    assert(dest != NULL);
    assert(src != NULL);

    void *temp = dest;

    while(n--)
    {
        *(char *)(dest++) = *(char *)(src++);
    }

    return temp;
}

int main(void)
{
    const char src[]="answer nihao";
    char *dest = (char *)malloc(sizeof(src));

    printf("%s\n",(char *)my_memcpy(dest,src,sizeof(src)));

    return 0;
}

memmove

/*************************************************************************
    > File Name: memmove.c
    > Author: AnSwEr
    > Mail: 1045837697@qq.com
    > Created Time: 2015年10月07日 星期三 16时54分18秒
 ************************************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

void *my_memmove(char *dest,const char *src,size_t n)
{
    if(n == 0)
    {
        return NULL;
    }

    assert(dest != NULL);
    assert(src != NULL);

    const char *a = src;
    char *b = dest;

    if(src >= dest || (src + n) <= dest)
    {
        while(n--)
        {
            *(b++) = *(a++);
        }
    }
    else
    {
        a += n;
        b += n;
        while(n--)
        {
            *(b--) = *(a--);
        }
    }

    return dest;
}


int main(void)
{
    char s[] = "hello";

    printf("%s\n",(char *)my_memmove(s,s+1,sizeof(s)-1));

    return 0;
}

loopmove

/*************************************************************************
    > File Name: loopmove.c
    > Author: AnSwEr
    > Mail: 1045837697@qq.com
    > Created Time: 2015年10月07日 星期三 20时16分09秒
 ************************************************************************/

/*
 * 循环右移
 */


#include<stdio.h>
#include<string.h>

#define MAX 256

void loopmove(char * str,int steps)
{
    char tmp[MAX];
    int len = strlen(str) - steps;

    memmove(tmp,str+len,steps);
    memmove(str+steps,str,len);
    memmove(str,tmp,steps);
}

int main(void)
{
    char str[] = "123456";

    loopmove(str,2);
    printf("%s\n",str);

    return 0;
}

del_cp

/*************************************************************************
    > File Name: del_cp.c
    > Author: AnSwEr
    > Mail: 1045837697@qq.com
    > Created Time: 2015年10月07日 星期三 19时27分49秒
 ************************************************************************/

/*
 * 删除字符串中的a,并复制b。
 */

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main(void)
{
    char s[] = "aabcbba";
    int i,j;
    int n = 0,count = 0;
    int len = strlen(s);

    for(i=0;i<len;i++)
    {
        if(s[i] != 'a')
        {
            s[n++] = s[i];
        }
        if(s[i] == 'b')
        {
            count++;
        }
    }

    s[n] = '\0';

    int newlen = count + n;
    s[newlen] = 0;

    /*倒序复制,不会打乱字符串顺序*/
    for(i=newlen-1,j=n-1;j>=0;j--)
    {
        s[i--] = s[j];
        if(s[j] == 'b')
        {
            s[i--] = s[j];
        }
    }

    printf("%s\n",s);

    return 0;
}

01swap

/*************************************************************************
    > File Name: 01swap.c
    > Author: AnSwEr
    > Mail: 1045837697@qq.com
    > Created Time: 2015年10月07日 星期三 12时40分43秒
 ************************************************************************/

/*
 * 把一个0-1串进行交换,计算最少交换次数
 */

#include<stdio.h>
#include<string.h>

const char arr[]="0001010101";

int main(void)
{
    int len = strlen(arr);
    int i,j;
    int count = 0;

    for(i=0,j=len-1;i<j;i++,j--)
    {
        for(;(i<j)&&(arr[i] == '0');i++)
        for(;(i<j)&&(arr[i] == '1');j--);
        if(i<j)
        {
            count++;
        }
    }

    printf("%d\n",count);

    return 0;
}

未完待续

反馈与建议

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值