Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何初始化指向输出缓冲区长度的指针?_C++_C_Pointers_Pcre - Fatal编程技术网

C++ 如何初始化指向输出缓冲区长度的指针?

C++ 如何初始化指向输出缓冲区长度的指针?,c++,c,pointers,pcre,C++,C,Pointers,Pcre,我使用以下代码使用库替换正则表达式: 但我似乎不知道如何正确定义输出缓冲区和指向其长度的指针(outlengthptr) 当我给outlengthptr一个固定值时,代码工作,但它保持不变,即它不会更改为output\u buffer的新长度。但根据规定,应将其更改为输出缓冲区的新长度: length、startoffset和rlength值是代码单位,而不是字符,正如outlengthptr所指向的变量的内容一样,它被更新为新字符串的实际长度 问题是: 当我将outlengthptr设置为固定

我使用以下代码使用库替换正则表达式:

但我似乎不知道如何正确定义
输出缓冲区和指向其长度的指针(
outlengthptr

当我给
outlengthptr
一个固定值时,代码工作,但它保持不变,即它不会更改为
output\u buffer
的新长度。但根据规定,应将其更改为
输出缓冲区的新长度

length、startoffset和rlength值是代码单位,而不是字符,正如
outlengthptr
所指向的变量的内容一样,它被更新为新字符串的实际长度

问题是:

  • 当我将
    outlengthptr
    设置为固定值时,最后一个字符串将被截断为固定长度
  • 如果我没有初始化变量
    outlengthtptr
    ,我会得到一个分段错误
  • 这是功能的原型:

     int pcre2_substitute(const pcre2_code *code, PCRE2_SPTR subject, PCRE2_SIZE length, PCRE2_SIZE startoffset, uint32_t options, pcre2_match_data *match_data, pcre2_match_context *mcontext, PCRE2_SPTR replacement, PCRE2_SIZE rlength, PCRE2_UCHAR *outputbuffer, PCRE2_SIZE *outlengthptr); 
    

    函数返回替换的次数。如果未找到匹配项,则该值可能为零,并且除非设置了
    PCRE2\u SUBSTITUTE\u GLOBAL
    ,否则该值永远不会大于1。如果发生错误,将返回一个负错误代码。除了
    PCRE2\u ERROR\u NOMATCH
    (从未返回)之外,来自
    PCRE2\u match()
    或子字符串复制函数的任何错误都会直接传回<对于无效的替换字符串(美元符号后的不可识别序列),返回代码>PCRE2_错误\u BADDreplacement
    如果输出缓冲区不够大,则返回
    PCRE2_错误\u NOMEMORY

    因此,从一个初始缓冲区开始,它应该容纳大部分结果——不要太大也不要太小。这取决于您的应用程序。
    例如,您可以尝试以输入字符串长度的120%作为启发式开始,因为对于最常见的正则表达式替换用法来说,这似乎是一个合理的赌注

    然后,使用此缓冲区调用函数,并传递其大小

    • 如果你得到一个积极的结果(或零),你就完成了
    • 如果您得到
      PCRE2\u ERROR\u NOMEMORY
      ,请将缓冲区大小加倍,然后重试(根据需要重复此步骤)
    • 如果您得到不同的错误代码,请将其作为真正的错误案例进行处理

    好的,如果需要的话,尝试定位64k、call、realloc。为了得到最好的答案,请张贴一条“当我将outlengthptr设置为固定值时,最后的字符串将以固定长度截断。”-我想这就是它的工作原理。如果不希望输出被截断,请传递一个足以容纳整个输出的缓冲区。@Jahid不,它不是。调用者负责管理输出缓冲区。@Jahid:没有人粗鲁无礼。我只是澄清了真相。您问:“如何初始化指向输出缓冲区长度的指针?”。嗯,你不能。指针不像数组那样具有长度属性(即引用对象的长度)。根据您使用的语言,这里可能会有不同的答案。这是一个很好的解决方法,但它涉及对同一函数的多次调用。这需要一些额外的时间…@Jahid我添加了一段。如果您明智地选择了开始大小,在大多数情况下,您可以进行1到2次迭代。一如既往:衡量。如果你做了太多的迭代,改变你的假设。如果你做得好,这在实践中不会是一个问题。或者,你可以发送一个函数的特性请求来计算所需的缓冲区大小——但是这种方法的缺点是,必须执行的最小正则表达式匹配数始终是2(一次用于尺寸估算,一次用于实际更换)。我想说性能损失会更大,因为正则表达式匹配比字符串复制需要更多的时间。理想的功能是要求此函数在返回
    PCRE2\u ERROR\u NOMEMORY
    时将
    outlengthptr
    更新到所需的大小,但这将是一个突破性的更改。我想我将提交一个bug报告,该函数应该根据其规范将
    outlengthptr
    更新为缓冲区大小。目前,我将在处理文件时使用FILENAME\u MAX。
     int pcre2_substitute(const pcre2_code *code, PCRE2_SPTR subject, PCRE2_SIZE length, PCRE2_SIZE startoffset, uint32_t options, pcre2_match_data *match_data, pcre2_match_context *mcontext, PCRE2_SPTR replacement, PCRE2_SIZE rlength, PCRE2_UCHAR *outputbuffer, PCRE2_SIZE *outlengthptr);