php内置函数分析之str_pad()

php内置函数分析之str_pad()

PHP_FUNCTION(str_pad)
{
    /* Input arguments */
    zend_string *input;                /* Input string 输入字符串*/
    zend_long pad_length;            /* Length to pad to 填充到多长.*/

    /* Helper variables */
    size_t num_pad_chars;        /* Number of padding characters (total - input size) 要填充进去的字符个数*/
    char *pad_str = " "; /* Pointer to padding string */
    size_t pad_str_len = 1; // 填充字符的个数 
    zend_long   pad_type_val = STR_PAD_RIGHT; /* The padding type value 填充类型,左填充、右填充、左右填充。默认右填充*/
    size_t       i, left_pad=0, right_pad=0;
    zend_string *result = NULL;    /* Resulting string 返回值*/

    if (zend_parse_parameters(ZEND_NUM_ARGS(), "Sl|sl", &input, &pad_length, &pad_str, &pad_str_len, &pad_type_val) == FAILURE) {
        return;
    }

    /* If resulting string turns out to be shorter than input string,
       we simply copy the input and return. */
    /* 如果pad_length(参数2)小于等于输入字符串的长度,则返回原始的输入字符串。*/
    if (pad_length < 0  || (size_t)pad_length <= ZSTR_LEN(input)) {
        RETURN_STRINGL(ZSTR_VAL(input), ZSTR_LEN(input));
    }

    /* 填充字符串长度为0,如:str_pad("abc", 10, ""),则Warning级别的错误。
       填充字符串的默认长度为1,即str_pad("abc", 10),的情况下pad_str_len=1。*/
    if (pad_str_len == 0) {
        php_error_docref(NULL, E_WARNING, "Padding string cannot be empty");
        return;
    }

    /*pad_type只能为STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH 或 0, 1, 2*/
    if (pad_type_val < STR_PAD_LEFT || pad_type_val > STR_PAD_BOTH) {
        php_error_docref(NULL, E_WARNING, "Padding type has to be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH");
        return;
    }

    num_pad_chars = pad_length - ZSTR_LEN(input); // 需要被填充进去的字符的数量
    if (num_pad_chars >= INT_MAX) { // num_pad_chars的最大值是2147483647。#define INT_MAX 2147483647
        php_error_docref(NULL, E_WARNING, "Padding length is too long");
        return;
    }

    result = zend_string_safe_alloc(1, ZSTR_LEN(input), num_pad_chars, 0);
    ZSTR_LEN(result) = 0;

    /* We need to figure out the left/right padding lengths. */
    switch (pad_type_val) {
        case STR_PAD_RIGHT:
            left_pad = 0;
            right_pad = num_pad_chars;
            break;

        case STR_PAD_LEFT:
            left_pad = num_pad_chars;
            right_pad = 0;
            break;

        // 左填充数量小于右,left_pad <= right_pad
        case STR_PAD_BOTH:
            left_pad = num_pad_chars / 2;
            right_pad = num_pad_chars - left_pad;
            break;
    }

    /* First we pad on the left. */
    /* 左填充:循环添加字符 */
    for (i = 0; i < left_pad; i++)
        ZSTR_VAL(result)[ZSTR_LEN(result)++] = pad_str[i % pad_str_len];

    /* Then we copy the input string. */
    /* 左填充完成后,附加输入字符串 */
    memcpy(ZSTR_VAL(result) + ZSTR_LEN(result), ZSTR_VAL(input), ZSTR_LEN(input));
    ZSTR_LEN(result) += ZSTR_LEN(input);

    /* Finally, we pad on the right. */
    /* 右填充:循环添加字符串 */
    for (i = 0; i < right_pad; i++)
        ZSTR_VAL(result)[ZSTR_LEN(result)++] = pad_str[i % pad_str_len];

    // 添加字符串结束标志'\0'
    ZSTR_VAL(result)[ZSTR_LEN(result)] = '\0';

    // 返回新字符串
    RETURN_NEW_STR(result);
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112494.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • asp.net 中的错误跳转 customerrors 对html文件不起作用 转载

    asp.net 中的错误跳转 customerrors 对html文件不起作用 转载一般对于asp.net的网站,都通过配置webconfig的customErrors一节来自定义错误页。 &lt;customErrorsmode="RemoteOnly"defaultRedirect="~/error.html"&gt;   &lt;/customErrors&gt; 但是在网站中访问不存在的html页面或其他非aspx文件,不会乖乖的跳转…

    2022年7月16日
    17
  • Java分页查询(真分页)

    Java分页查询(真分页)Java分页查询(真分页)

    2022年4月25日
    38
  • JS获取当前年份_js获取当前时间年月日

    JS获取当前年份_js获取当前时间年月日小知识积累(2)lettimestamp=Date.parse(newDate());letdate=newDate(timestamp);//获取年份letthieYear=date.getFullYear();

    2022年9月23日
    3
  • 网页跳转qq聊天代码_html全屏代码

    网页跳转qq聊天代码_html全屏代码偶尔从某地得到我去看了看,果然可以但是又想了想他是怎么样和TENCENT数据库连接的呢?呵呵~自己做一个吧!原代码如下,自己有PHP空间的话,你也可以提供QQ在线的js代码服务了!连接代码把下面的代码保存成PHP文件就可以了!我想他也是连接别人的数据吧~那我也连接一下他的http://www.gaodaima.com/45503.html让你拥有自己的QQ在线显示代码(又是转_php$file=f…

    2022年10月17日
    3
  • spring源码分析之如何解决循环依赖

    spring源码分析之如何解决循环依赖

    2021年8月4日
    51
  • Cover Letter实用指南

    Cover Letter实用指南1、什么是CoverLetter?指的是投稿信2、coverletter的内容主要包括那些?应该简述所投稿件的核心内容、主要发现和意义,拟投期刊,对稿件处理有无特殊要求等(如“nottoreview”list)。另外,请附上主要作者的中文姓名、通讯地址、电话、传真和e-mail地址。此外有的杂志要求推荐几位审稿人及其联系方式。以及谁已经阅读过该文(当然是牛人)。

    2022年5月1日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号