常见面试字符串操作函数编写总结,测试全部能用,但并不保证完全和原型一样严谨。
**#include "stdio.h"
//功能: 查找字符串s中首次出现c字符的位置
//说明: 返回首次出现c的位置的指针,返回的地址是被查找的字符串指针开始的第一个与c相同字符的指针,若s中不存在c则返回NULL
char *my_strchr(const char *s, int c)
{
if(s == NULL)
{
return NULL;
}
while(*s != '\0')
{
if(*s == (char)c )
{
return (char *)s;
}
s++;
}
return NULL;
}
//功能是从源src所指的内存地址的起始位置开始拷贝count个字节到目标dest所指的内存地址的起始位置中。
//size_t 当unsigned int用就ok
void *Mymemcpy(void *dest, const void *src, unsigned int count
{
char *p1=(char *)dest;
char *p2=(char *)src;
if (NULL == dest || NULL == src || count <= 0)
return NULL;
while (count--)
*p1++ = *p2++;
return dest;
}
//strcat把src所指向的字符添加到dest结尾处
//(覆盖原dest结尾处的'\0'),并添加新的'\0'。
char *Mystrcat(char *dest,const char *str)
{
char *p=dest;
while(*p!='\0') ++p;
while((*p++=*str++)!='\0')
{
//
}
return dest;
}
/*
// C标准库中也有个memset函数,但是我们这里用的是自己写的,没用标准库
函数功能:将p中当前位置后面的length个字节用 val 替换 。
用来对一段内存空间全部设置为某个字符
一般用在对定义的字符串进行初始化为‘ ’或‘/0’;
函数参数:
①p为要操作的内存的指针。
②val为要设置的值。你既可以向 val传递 int 类型的值,也可以传递 char 类型的值,int 和 char 可以根据 ASCII 码相互转换。
③length为p的前 length 个字节,sizeof(p指向的数组)
*/
void memset(char *p, int val, int length)
{
int i;
for (i=0; i<length; i++)
{
p[i] = val;
}
}
/*
函数功能:它对两个字符串进行比较,然后返回比较结果
返回结果如下规定:
①cs小于ct,返回负值或者-1;
②cs大于ct,返回正值或者1;
③cs等于ct,返回0;
*/
int strcmp(const char *cs, const char *ct)
{
unsigned char c1, c2;
while (1) {
c1 = *cs++;
c2 = *ct++;
if (c1 != c2)
return c1 < c2 ? -1 : 1;
if (!c1)
break;
}
return 0;
}
/*
函数功能:strcpy把从src地址开始且含有'\0'结束符的字符串复制到以dst开始的地址空间
①const修饰:源字符串参数用const修饰,防止修改源字符串;
*/
void strcpy(char *dst, const char *src)
{
while (*src != '\0')
{
*dst++ = *src++;
}
}
//将用户输入的字符串命令str按照空格分割成多个字符串,依次放入cmd这个二维数组
void cmdsplit(char cmd[][MAX_LEN_PART],const char *str)
{
int m = 0, n = 0; // m表示二位数组第一维,n表示第二维
while (*str != '\0')
{
if (*str != ' ')
{
cmd[m][n] = *str;
n++;
}
else
{
cmd[m][n] = '\0';
n = 0;
m++;
}
str++;
}
cmd[m][n] = '\0';
}**