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;
}
未完待续
反馈与建议
- 微博:@AnSwEr不是答案
- github:AnSwErYWJ
- 博客:AnSwEr不是答案的专栏