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

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

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

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;
}
时间: 2024-10-11 19:58:08

长度受限的字符串函数及其他字符串函数的相关文章

【C语言】编写一个函数,求字符串长度

//编写一个函数,求字符串长度 #include <stdio.h> #include <assert.h> int my_strlen(const char *p) { int len=0; assert(p); while (*(p++)) { len++; } return len; } int main() { char *p = "abcdef"; printf("%d\n", my_strlen(p)); return 0; }

【c语言】实现一个函数,求字符串的长度

// 实现一个函数,求字符串的长度 #include <stdio.h> #include <assert.h> int my_strlen(char const *p) { int count = 0; assert(p != NULL); while(*p) { count++; p++; } return count; } int main() { char *p = "zhaoyaqian"; printf("长度是:%d\n", m

【c语言】实现一个函数,求字符串的长度,不允许创建第三方变量

// 实现一个函数,求字符串的长度,不允许创建第三方变量. #include <stdio.h> #include <assert.h> int my_strlen_no(char const *p) { assert(p != NULL); if (*p == NULL) return 0; else return (1 + my_strlen_no(p + 1)); } int main() { char *p = "zhaoyaqian"; printf(

编写一个函数,求字符串的长度

方法一:先把汉字用两个单字节字符代替,返回代替后的字符创长度 function getBytes1(str){ var str=str.replace(/[^\x00-\xff]/g,'**"); return str.length;} 方法二:先计算字符创长度并记录该值,循环字符串,若为汉字,长度加1,最终返回长度 function getBytes2(str){ var bytes=str.length; for(var i=bytes;i--;){ if(str.charCodeAt(i)

如何在命令长度受限的情况下成功get到webshell(函数参数受限突破、mysql的骚操作)

0x01 问题提出 还记得上篇文章记一次拿webshell踩过的坑(如何用PHP编写一个不包含数字和字母的后门),我们讲到了一些PHP的一些如何巧妙地绕过数字和字母受限的技巧,今天我要给大家分享的是如何在命令长度受限的情况下成功get到webshell,以及关于函数参数受限的突破,mysql的一些骚操作技巧~~~ 0x02 问题分析 我们先看个例子: <?php $param = $_REGUEST['param']; if(strlen($param) < 17){ eval($param)

mysql学习笔记(五)--- 字符串函数、日期时间函数

一.常见字符串函数: 1.CHAR_LENGTH  获取长度(字符为单位) 2.FORMAT  格式化 3.INSERT  替换的方式插入 4.INSTR  获取位置 5.LEFT/RIGHT  取左.取右 6.LENGTH   获取长度(字节为单位) 7.LTRIM/RTRIM/TRIM 去空格(左/右/自定义) 8.STRCMP  字符串比较 9.CONCAT  字符串拼接 10.SUBSTRING  字符串截取 1.CHAR_LENGTH:获取长度(字符为单位) CHAR_LENGTH()

MySQL字符串函数、日期时间函数

MySQL字符串函数.日期时间函数 一.常见字符串函数: 1.CHAR_LENGTH  获取长度(字符为单位) 2.FORMAT  格式化 3.INSERT  替换的方式插入 4.INSTR  获取位置 5.LEFT/RIGHT  取左.取右 6.LENGTH   获取长度(字节为单位) 7.LTRIM/RTRIM/TRIM 去空格(左/右/自定义) 8.STRCMP  字符串比较 9.CONCAT  字符串拼接 10.SUBSTRING  字符串截取 1.CHAR_LENGTH:获取长度(字符

Strlcpy和strlcat——一致的、安全的字符串拷贝和串接函数

概述 随着流行的缓冲区溢出攻击的增加,越来越多程序员开始使用带有大小,即有长度限制的字符串函数,如strncpy() 和strncat() .尽管这种趋势令人十分鼓舞,但通常的标准C 字符串函数并不是专为此而设计的.本文介绍另一种直观的,一致的,天生安全的字符串拷贝API . 当函数 strncpy()和 strncat()作为 strcpy()和 strcat()的安全版本来使用时,仍然存在一些安全隐患. 这两函数以不同的,非直观的方式来处理NUL 结束符和长度参数,即使有经验的程序员也会混淆

处理PHP中字符串的常用操作及函数

[合肥开源IT教育][php培训][开源IT教育][合肥php培训][合肥软件开发] 1. 确定一个字符串的长度 这是最为常见和基础的例子,对于确定一个字符串的长度,我们应该使用strlen()函数,比如要获取下面字符串$text 的长度:$text = "sunny day"; $count = strlen($text); // $count = 9 2. 截取文本来创建一个概要 新闻性质的网站通常会在发布正文中的开头部分截取大约200字左右,并在末尾加上省略号来形成一个摘要.你可