长度受限的字符串函数这下函数接受一个显示的长度做参数,用于限定比较或复制的字符数,防止一些长字符串从目标数组中溢出。

三中常见的受限字符串函数:

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
#include
#include
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
#include
#include
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
#include
#include
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[]

顺便介绍一下strpbrk与strrstr这两个函数:

strpbrk原型:char *strpbrk(char const *dst,char const *group);

功能:查找group中任意一个字符在dst中首次出现的位置,并返回这个地址

strpbrk功能实现

#include
#include
#include
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
#include
#include
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;}