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
- 如果您得到不同的错误代码,请将其作为真正的错误案例进行处理
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);