为什么我的正则表达式函数只在第一次运行?

时间:2016-10-25 00:04:01

标签: c regex

我正在为家庭作业分配一些代码,即在文本文件中搜索某些模式并生成报告。目前要测试它我只是将我的报告打印到屏幕上。但我的搜索功能似乎只是第一次运行。我已经单独测试了正则表达式并且他们都完成了正确的匹配,但是一旦我把它放在函数中它只在它第一次运行时工作。有谁可以向我解释为什么会这样?

#include <stdio.h>
#include <stdlib.h>
#include <regex.h>


// Report expressions
char *reports[5] = {"^ {0,}[0-9]{1,4}", "S", "L", "S {0,1}(1|2)", "^ {0,}[0-9]{1,4} {1,} L | 3$"};

void search(FILE *fp, char *report, int index) {
        regex_t reg;
        char buf[256];
        int reti = regcomp(&reg,report,REG_EXTENDED);

        if(reti) {
                printf("Regex compilation failed, noob\n");
                exit(1);
        }
        printf("Report %d\n", index);

        while(fgets(buf,sizeof(buf),fp) != NULL) {
                //printf("%s",buf);
                reti = regexec(&reg,buf,0,NULL,0);
                if(!reti) { //if there's a match
                        printf("%s",buf);
                } else if(reti == REG_NOMATCH) {
                        printf("No match\n");
                }
        }

        regfree(&reg);
}

int main(void) {
        FILE *fp;

        fp = fopen("./Hammer.data","r");

        if(fp == NULL) {
                perror("Error opening file");
                return(-1);
        }

        for(int i = 0;i < 5;i++) {
            search(fp, reports[i],i+1);
        }

        fclose(fp);

        return(0);
}

1 个答案:

答案 0 :(得分:1)

while(fgets(buf,sizeof(buf),fp) != NULL) 

这将导致fp指向文件的末尾。因此,下次调用该函数时,fgets将立即返回NULL。一个解决方法是在rewind循环之前fgets {{1}}文件指针。