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

何が起こっているかというと、3 行目でキックアウトする必要がある最初の行でキックアウトしているということです。これは非常に簡単に解決できると確信していますが、私はそれを理解していないようです。助けていただければ幸いです。また、どのように対処すればよいですか

\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 に答える