// Returns a list of topic numbers found on the page
vector<string> findTopics(char* rData, int rDataLen) {
pcre *re;
const char *error;
int erroffset;
re = pcre_compile(
"topic/([0-9]+)", /* the pattern */
0, /* default options */
&error, /* for error message */
&erroffset, /* for error offset */
NULL); /* use default character tables */
if(re == NULL) {
printf("Couldn't compile regex (%s)", error);
// exit(-1):
}
int regOf[2];
vector<string> topics;
char *topic;
int offset = 0;
int rc = 1;
// Basically a preg_match_all()
while(true) {
rc = pcre_exec(re, NULL, rData, rDataLen, offset, 0, regOf, sizeof(regOf));
if (rc < 2) {
break;
}
topic = new char[8];
sprintf(topic, "%.*s\n", regOf[2*1+1] - regOf[2*1], rData + regOf[2*1]);
topics.push_back(topic);
offset = regOf[1];
}
pcre_free(re);
return topics;
}
该函数应该在
topic/[0-9]+
中获取我解析的特定内容中找到的“主题”列表(匹配rData
),并且几乎可以正常工作。 topics
充满了应该的主题编号。当我在Visual Studio中调试它时,在函数结束(返回)后立即得到以下错误消息:运行时检查失败#2-变量'regOf'周围的堆栈已损坏。
我无法弄清楚我在做什么错,想知道是否有人可以指出我正确的方向。
最佳答案
您使用2个元素定义regOf。然后,您将sizeof(regOf)传递给pcre_exec函数,但是该函数询问数组中有多少个项目,而不是大小是多少字节。这样,该函数认为它有8个插槽可填充,只有2个,因此可以耗尽数组末尾并破坏内存。