码迷,mamicode.com
首页 > 其他好文 > 详细

长度受限的字符串函数及其他字符串函数

时间:2016-04-03 20:33:28      阅读:281      评论:0      收藏:0      [点我收藏+]

标签:受限字符串函数

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


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



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


本文出自 “11132019” 博客,请务必保留此出处http://11142019.blog.51cto.com/11132019/1759874

长度受限的字符串函数及其他字符串函数

标签:受限字符串函数

原文地址:http://11142019.blog.51cto.com/11132019/1759874

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!