下面我们模拟实现一下几个字符串操作的函数。
模拟实现strncpy:
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
char *my_strncpy(char *dest, char *src, size_t n)
{
assert(dest != NULL);
assert(src != NULL);
char *p = dest;
while (n)
{
*dest = *src;
dest++;
src++;
n--;
}
return p;
}
int main(void)
{
char buf1[100] = "heelo";
char buf2[100] = "world";
printf("%s\n", my_strncpy(buf2, buf1, 4));
system("pause");
return 0;
}
模拟实现strncmp:
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
int my_strncmp(const char *dest, const char *src, size_t count)
{
assert(dest != NULL);
assert(src != NULL);
while (count--)
{
if ((*dest - *src) > 0)
{
return 1;
}
else if ((*dest - *src) < 0)
{
return -1;
}
else
{
;
}
*dest++;
*src++;
}
return 0;
}
int main()
{
char arr[] = "zhangsan";
char arr1[] = "zhangsi";
int ret = my_strncmp(arr, arr1, 8);
printf("ret = %d", ret);
system("pause");
return 0;
}
模拟实现strncat:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
char* my_strncat(char *dest, const char *src,size_t count)
{
assert(dest != NULL);
assert(src != NULL);
char *tmp = dest;
while (*dest != '\0')
{
*dest++;
}
while (count && (*dest++ = *src++))
{
if (*src == '\0')
{
*dest = *src;
break;
}
else
{
count--;
}
}
return tmp;
}
int main()
{
char arr[20] = "hello";
char arr1[] = "world";
char *tmp = my_strncat(arr, arr1, 2);
printf("%s\n", tmp);
printf("%d", strlen(tmp));//测试下有没有把\0连接到arr里
system("pause");
return 0;
}
模拟实现strstr:
#include<stdio.h>
#include<stdlib.h>
char* my_strstr(const char *dest, const char *src)
{
const char *cp = dest;
const char *p = src;
const char *start = NULL;
while(*cp)
{
start = cp;
while(*cp && *p && *cp == *p)
{
cp++;
p++;
}
if(*p == '\0')
{
return (char *)start;
}
cp = start+1;
p = src;
}
return NULL;
}
int main()
{
char arr[] = "abcdefgbcd";
char arr1[] = "bcd";
char *tmp = my_strstr(arr, arr1);
if(tmp == NULL)
{
printf("没找到\n");
}
else
printf("%s",tmp);
system("pause");
return 0;
}
模拟实现strrstr:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char* my_strstr(const char *dest, const char *src)
{
const char *cp = dest;
const char *p = src;
const char *start = NULL;
while(*cp)
{
start = cp;
while(*cp && *p && *cp == *p)
{
cp++;
p++;
}
if(*p == '\0')
{
return (char *)start;
}
cp = start+1;
p = src;
}
return NULL;
}
char* my_strrstr(const char *dest, const char *src)
{
char *p = NULL;
assert(dest != NULL);
assert(src != NULL);
while (*dest)
{
if (my_strstr(dest, src))
{
p = my_strstr(dest, src);
dest = p + 1;
}
else
{
return p;
}
}
return p;
}
int main()
{
char arr[] = "abcdefgbcd";
char arr1[] = "bcd";
char *cp = my_strstr(arr, arr1);
char *p = my_strrstr(arr, arr1);
if (cp == NULL)
{
printf("没找到\n");
}
else
printf("%s\n", cp);
if (p == NULL)
{
printf("没找到\n");
}
else
printf("%s\n", p);
system("pause");
return 0;
}
模拟实现strchr:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h> #include<assert.h> char *my_strchr(char *str, int key) { assert(str != NULL); while (*str != '\0') { if (*str == key) { return str; } str++; } return NULL; } int main() { char arr[] = "hello world!"; int n = 0; printf("请输入你要查找的字符:"); scanf("%c", &n); char* ret = my_strchr(arr, n); printf("%s\n", ret); return 0; }
模拟实现strrchr:#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<assert.h> char *my_strrchr(char *str, int key) { assert(str != NULL); char * ret = 0; while (*str != '\0') { if (*str == key) { ret = str; } str++; } if (ret != 0) { return ret; } else return NULL; } int main() { char arr[] = "hello world"; int n = 0; printf("请输入你要查找的字符:"); scanf("%c", &n); char *ret = my_strrchr(arr, n); printf("%s\n", ret); return 0; }