совпадение регулярного выражения, приводящее к неожиданному результату - PullRequest
0 голосов
/ 18 марта 2012

вот код для совпадения регулярного выражения

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int matchhere(char *regexp,char *text);
int matchstar(int c,char *regexp,char *text);
int match(char *regexp,char *text)
{

    if(regexp[0]=='^')
        return matchhere(regexp+1,text);

    do {
        if(matchhere(regexp,text))
            return 1;


    } while(*text++!='\0');

    return 0;
}

int matchhere(char *regexp,char *text)
{
    if(regexp[0]='\0')
        return 1;
    if(regexp[1]='*')
        return matchstar(regexp[0],regexp+2,text);

    if(regexp[0]=='$' && regexp[1]=='\0')
        return *text=='\0';
    if(*text!='\0' && regexp[0]=='.' || regexp[0]==*text)
        return matchhere(regexp+1,text+1);
    return 0;
}

int main()
{
    char *regexp="^abb";
    char *text="cabbacd";
    cout<<match(regexp,text)<<endl;

    return 0;
}
int matchstar(int c,char *regexp,char *text)
{
    do {
        if(matchhere(regexp,text))
            return 1;
    }
    while(*text!='\0' && (*text++==c || c=='.'));

    return 0;
}

пишет ошибку во время выполнения, после отладки я получил следующий результат

+       regexp  0x00365839 "abb"    char *
        regexp[0]   97 'a'  char
+       text    0x00365830 "cabbacd"    char *

почему? Пожалуйста, помогите мне, для уточнения, я не могу больше отлаживать, потому что это дает мне ошибку неожиданности с окном

1 Ответ

3 голосов
/ 18 марта 2012
if(regexp[0]='\0')
     return 1;
if(regexp[1]='*')

Эти задания не просто логически неправильны, они незаконны.Нельзя изменять строковый литерал.Если бы вы использовали const char*, эта проблема была бы найдена для вас компилятором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...