0

下面的代码使用正则表达式验证文件时遇到问题。我的文件只能包含字母或数字。我的正则表达式是:

#define to_find "^[a-zA-Z0-9]+$"

它位于我的 main.h 文件中。下面的代码在我的 main.c

#include <ctype.h>
#include <errno.h>
#include <regex.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

#include "main.h"

int main(int argc, char * argv[])
{
    int ret_val;
    regex_t regex;
    FILE *fp;
    char line[1024];

     if (regcomp(&regex, to_find, REG_EXTENDED) != 0)
     {
        fprintf(stderr, "Failed to compile regex '%s'\n", to_find);
        return EXIT_FAILURE;
     }

    if (argc > 2)
    {
        printf("Usage: tree OR tree [filename]\n");
        return EXIT_FAILURE;
    }

    else if (argc == 2)
    {
        fp = fopen(strcat(argv[1],".dat"), "r");

        printf("file opened\n");
        while ((fgets(line, 1024, fp)) != NULL)
        {
            line[strlen(line) - 1] = '\0';
            if ((ret_val = regexec(&regex, line, 0, NULL, 0)) != 0);
            {
                printf("Error: %s\n", line);
                return EXIT_FAILURE;
            }
        }

        fclose(fp);
        printf("File closed\n");        
    }

    return 0;
}

我正在阅读的文件名为 names.dat,其中包含:

int
char
[
double

正在发生的事情是它在第一行踢出它应该在第三行踢出。我确信这很容易解决,但似乎我还没有弄清楚。我将不胜感激任何帮助。还有,我该如何处理

\n

文件中的字符?该文件将有几行。提前致谢。

4

1 回答 1

1

您有一些小错误,但导致错误的错误是:

// Do you see this sweet little semicolon :P ----------------+
if ((ret_val = regexec(&regex, line, 0, NULL, 0)) != 0); // <+
{
    printf("Error: %s\n", line);
    return EXIT_FAILURE;
 }

在这条线旁边:

fp = fopen(strcat(argv[1],".dat"), "r");

您不能添加到argv,您需要创建一个新缓冲区来保存数据,创建一个PATH_MAX大小为添加的缓冲区添加路径。这是一个改进的版本:

#include <ctype.h>
#include <errno.h>
#include <regex.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <limits.h>

#define to_find "^[a-zA-Z0-9]+$"

int main(int argc, char * argv[])
{
    int ret_val;
    regex_t regex;
    FILE *fp;
    char file[PATH_MAX];
    char line[1024];

     if (regcomp(&regex, to_find, REG_EXTENDED) != 0)
     {
        fprintf(stderr, "Failed to compile regex '%s'\n", to_find);
        return EXIT_FAILURE;
     }

    if (argc > 2)
    {
        printf("Usage: tree OR tree [filename]\n");
        return EXIT_FAILURE;
    }

    else if (argc == 2)
    {
        sprintf(file, "%s.dat", argv[1]);
        fp = fopen(file, "r");
        if( fp == NULL ) {
            perror("Error");
            return -1;
        }

        printf("file opened\n");
        while (fscanf(fp, "%1023s", line) > 0)
        {
            if ((ret_val = regexec(&regex, line, 0, NULL, 0)) != 0)
            {
                printf("Not match: %s\n", line);
                //return EXIT_FAILURE;
            } else {
                printf("Match: %s\n", line);
            }
        }

        regfree(&regex);
        fclose(fp);
        printf("File closed\n");        
    }

    return 0;
}

查看差异:http ://www.diffchecker.com/8itbz5dy

测试:

$ gcc -Wall sample.c 
$ 
$ cat name.dat 
int
char
[
double
$ ./a.out name
file opened
Match: int
Match: char
Not match: [
Match: double
File closed
$ 
于 2013-09-01T22:27:31.270 回答