1. 模拟实现strncpy
2.模拟实现strncat
3.模拟实现strncmp
之前我也写过字符串模拟函数,对一个c语言中的库函数进行模拟,如果不细心的人今天就感觉这三个函数之前写过,但是实际上你仔细看就会发现这三个函数和之前的函数是有所不同的,在名字上就能看出这三个库函数在之前的函数名中加了一个n字母,其实总结的来说,这三个带n的库函数可以理解成这些库函数是对内存中的字节进行操作的。
Strncpy是char * strncpy ( char * destination, const char * source, size_t num );
,把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回dest。
Strncat 是char * strncat ( char * destination, const char * source, size_t num );
主要功能是在字符串的结尾追加n个字符
Strncmp是int strncmp ( const char * str1, const char * str2, size_t num );
str1, str2 为需要比较的两个字符串,n为要比较的字符的数目。字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。strncmp()首先将s1 第一个字符值减去s2 第一个字符值,若差值为0 则再继续比较下个字符,直到字符结束标志'\0',若差值不为0,则将差值返回。例如字符串"Ac"和"ba"比较则会返回字符"A"(65)和'b'(98)的差值(-33)。注意:要比较的字符包括字符串结束标志'\0',而且一旦遇到'\0'就结束比较,无论n是多少,不再继续比较后边的字符。若str1与str2的前n个字符相同,则返回0;若s1大于s2,则返回大于0的值;若s1 若小于s2,则返回小于0的值。
模拟实现strncpy
char *my_strncpy(char *dest, const char *src, int n)
{
assert(dest);
assert(src);
char *p = dest;
while (n--)
{
*p++ = *src++;
}
return dest;
}
模拟实现strncat
char *my_strncat(char *dest, const char *src, int n)
{
assert(dest);
assert(src);
char *p = dest;
while (*p!=0)
{
*p++;
}
while (n--)
{
*p++ = *src++;
}
*p = 0;
return dest;
}
模拟实现strncmp
int my_strncmp(const char *src1, const char *src2, int n)
{
assert(src1);
assert(src2);
while ((src1 != NULL) && (src2 != NULL) && (n != 0))
{
if ((*src1 - *src2) > 0)
return 1;
if ((*src1 - *src2) < 0)
return -1;
*src1++;
*src2++;
n--;
}
if (*src1 == 0)
return -1;
if (*src2 == 0)
return 1;
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char *my_strncpy(char *dest, const char *src, int n)
{
assert(dest);
assert(src);
char *p = dest;
while (n--)
{
*p++ = *src++;
}
return dest;
}
char *my_strncat(char *dest, const char *src, int n)
{
assert(dest);
assert(src);
char *p = dest;
while (*p!=0)
{
*p++;
}
while (n--)
{
*p++ = *src++;
}
*p = 0;
return dest;
}
int my_strncmp(const char *src1, const char *src2, int n)
{
assert(src1);
assert(src2);
while ((src1 != NULL) && (src2 != NULL) && (n != 0))
{
if ((*src1 - *src2) > 0)
return 1;
if ((*src1 - *src2) < 0)
return -1;
*src1++;
*src2++;
n--;
}
if (*src1 == 0)
return -1;
if (*src2 == 0)
return 1;
return 0;
}
int main()
{
char dest1[]="abcde";
char src1[] = "hello world";
char dest2[20] = "abcde";
char src2[] = "hello world";
int ret = 0;
my_strncpy(dest1, src1,3);
printf("%s\n", dest1);
printf("\n");
my_strncat(dest2, src2, 10);
printf("%s\n", dest2);
ret=my_strncmp(dest2, src2, 4);
printf("%d\n", ret);
system("pause");
return 0;
}