求助:C++正则表达式之否定式 导致溢出崩溃

543先生 2016-05-07 06:04:45
以下C++程序使用了“否定式”的正则表达式,即(?!xxx)表达式。
调试发现当匹配的字符串长度达到499字节以上时,程序会发生溢出,崩溃。

测试时输入497个a加上hi作为字符串,如:aaaaaaaaaa......hi

如果不使用不含“否定式”的表达式,如:[a-z]+ 就不会崩溃,匹配几千字节长的字符串都不会崩溃。但现在我需要用否定式,请各位帮忙解决,感谢!


#include "stdafx.h"
#include <regex>
#include <iostream>
#include <stdio.h>
#include <string>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
char myreg[128];
sprintf( myreg,"%s","((?!hi)[a-z])+" ); //匹配任意一串字母,但不能含"hi"这个单词。
regex pattern(myreg,regex_constants::icase);
printf("input strings:\n");
string buf;

while(cin>>buf)
{
printf("*******\n%s\n********\n",buf.c_str());
if(buf == "quit")
{
printf("quit now!\n");
break;
}
printf("compare now! '%s'\n", buf.c_str());
bool valid = regex_search(buf,pattern);

if(!valid)
printf("no match!\n");
else
printf("ok\n");
}

return 0 ;
}
...全文
201 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-05-09
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}
在现实世界中,除时间和空间可能是无限的以外,其它任何事物都是有限的。

64,673

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧