长度受限的字符串函数:这下函数接受一个显示的长度做参数,用于限定比较或复制的字符数,防止一些长字符串从目标数组中溢出。
三中常见的受限字符串函数:
char * strncpy(char *dst,char const *src,size_t len);
strncpy从src中复制len个字符到dst中,如果strlen(src)的长度小于len,则多出来的字符用NUL填补,注意,当strlen(src)大于或者等于len,strncpy不会以NUL结尾,所以使用strncpy时要慎重考虑。
strncpy功能的实现:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char * my_strncpy(char *dst, char const *src, int len)
{
assert(dst != NULL);
assert(src != NULL);
char *p = dst;
while (len--)
{
if (*src != '\0' )
*p++ = *src++;
else
*p = '\0' ;
}
return dst;
}
int main()
{
int len = 0;
char arr1[100];
char arr2[100];
scanf( "%s%s%d" , arr1, arr2,&len);
char *ret=my_strncpy(arr1, arr2, len);
printf( "%s\n" ,ret);
system( "pause" );
return 0;
}
char * strncat(char *dst,char const *src,size_t len);
同样的,strncat最多将src中的len个字符复制到dst中,并且以NUL结尾,但它不会像strncpy一样用NUL进行填充,而且strncat也不考虑dst数组中剩下的空间是否足够放下len个字符。
strncat功能的实现:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char * my_strncat(char *dst, char const *src, int len)
{
assert(dst != NULL);
char *p = dst;
while (*p!= '\0' )
{
p++;
}
while (len--)
{
if (*p++= *src++)
;
else
break ;
}
if (len==-1)
*p = '\0' ;
return dst;
}
int main()
{
char arr1[100];
char arr2[100];
int len = 0;
scanf( "%s%s%d" , arr1, arr2, &len);
char *ret = my_strncat(arr1, arr2, len);
printf( "%s\n" , ret);
system( "pause" );
return 0;
}
int strncmp(char const *dst,char const *src,size_t len);
strncmp与strcmp唯一的区别就是strncmp最多比较len个字符,在返回值方面完全相同。
strncmp功能实现:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int my_strncmp(char const *dst, char const *src, int len)
{
assert(dst != NULL);
assert(src != NULL);
while (len)
{
if (*dst == *src)
{
if (*src == '\0' )
return 0;
dst++;
src++;
}
else if (*dst > *src)
return 1;
else
return -1;
}
return 0;
}
int main()
{
char arr1[100];
char arr2[100];
int len = 0;
scanf( "%s%s%d" , arr1, arr2, &len);
int ret = my_strncmp(arr1, arr2, len);
if (ret == 1)
printf( "arr1[]>arr2[]\n" );
else if (ret == 0)
printf( "arr1[]=arr2[]\n" );
else if (ret==-1)
printf( "arr1[]<arr2[]\n" );
system( "pause" );
return 0;
}
顺便介绍一下strpbrk与strrstr这两个函数:
strpbrk原型:char *strpbrk(char const *dst,char const *group);
功能:查找group中任意一个字符在dst中首次出现的位置,并返回这个地址。
strpbrk功能实现:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char * my_strpbrk(char const *dst, char const *src)
{
assert(dst != NULL);
assert(src != NULL);
char *p1 = dst;
while (*p1!='\0' )
{
char *p2 = src;
while (*p2!='\0' )
{
if (*p1 == *p2)
return p1;
p2++;
}
p1++;
}
return NULL;
}
int main()
{
char arr1[100];
char arr2[20];
scanf( "%s%s" , arr1, arr2);
char *ret=my_strpbrk(arr1,arr2);
printf( "%#p\n" , &*ret);
system( "pause" );
return 0;
}
参考strrchr这个函数实现一个库中没有的strrstr函数。
功能:strrstr与strstr唯一的区别就是strstr返回的是子字符串首次出现的位置,而strrstr返回的是最后一次出现的地址。
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char * my_strrstr(char const *dst, char const *src)
{
char *last = NULL;
assert(dst!=NULL);
while (*dst != '\0' )
{
if (*dst == *src)
{
char *p1=dst+1;
char *p2 =src+1;
while (*p1==*p2)
{
if (*p2 == '\0' )
{
last = dst;
break ;
}
p1++;
p2++;
}
if (*p2 == '\0' )
last= dst;
}
dst++;
}
return last;
}
int main()
{
char arr1[100];
char arr2[50];
scanf( "%s%s" , arr1, arr2);
char *ret=my_strrstr(arr1, arr2);
printf( "%#p\n" , &*ret);
system( "pause" );
return 0;
}
转载于:https://blog.51cto.com/11142019/1759874