0

fgets を使用してファイルを読み込んでいます。ファイルの各行を正規表現と照合する必要があります。英数字以外の文字がある場合は、プログラムを終了して、行番号と「不正な」文字を表示する必要があります。何が起こっているかというと、「悪い」キャラクターの前に追い出しているということです。これが私の.datファイルです:

howard jim dave 
joe
(
Maggie

プログラムの私の出力は次のとおりです。

file opened
Digit: howard jim dave 
is not alphanumeric on line: 1
Exiting program!
File closed

起こるべきことは、3 行目でキックアウトすることです。これは起こっていません。

main.h ファイルにある私の正規表現は次のとおりです。

#ifndef MAIN_H
#define MAIN_H

#ifdef  __cplusplus
extern "C" {
#endif

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

ここに私のfileCheck.cがあります

#include "main.h"

int fileCheck(FILE *fp)
{

    int ret_val;
    int line_count = 0;
    char file[BUFF];
    regex_t regex;

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

    if (fp != NULL)
    {
        while (fgets(file, BUFF, fp))
        {
            line_count++;

            if ((ret_val = regexec(&regex, file, 0, NULL, 0)) != 0)
            {
                printf("Digit: %s is not alphanumeric on line: %d\n", file, line_count);
                printf("Exiting program!\n");
                return EXIT_FAILURE;
            }
        }
    }

}

「\n」文字が問題なのかどうかはわかりません。そうではないと思います。isalnum() かどうかはよく知っていますが、正規表現を使用しています。この問題の可能な解決策は何ですか? ご提案いただきありがとうございます。

編集: fgets の代わりに fscanf を使用した場合、上記の正規表現は問題なく機能したことに言及したいと思います。変更の理由は、各行を数える必要があるためです。私が正しければ、fscanf は改行文字を無視します。改行を数える方法が必要です。fscanf を使用して新しいものをカウントすることは可能ですか? 私の元のファイル読み取りループは次のとおりです。

while (fscanf(fp, "%11023s", file) != EOF
{
    line_count++;
    if (regexec(&regex, file, 0, NULL, 0) != 0)
    {
        printf("%s%d wrong:\n, file, line_count);
        return EXIT_FAILURE;
    }
}
4

1 に答える 1

1

howard jim dave空白が含まれています。

Edit3:
有効な行のみを検索する一致に焦点を当てた理由は
、後でより複雑になる単純なテスト シナリオを使用しているように見えたからです。 ただし、これが必要な場合は、実際の解決策は、英数字以外の空白以外の文字
を探すことです。 使用している正規表現フレーバーが最初から最後まで一致する必要がある場合、 これは機能しません。


  #define to_find "[^a-zA-Z0-9\\s]" 
     or, 
  #define to_find "[^a-zA-Z0-9\\ \\t\\f\\r\\n]"

   . . .
     Then down here if the regex matches, it found non alpha numeric

  if ( regexec(&regex, file, 0, NULL, 0)) == 0 )
  {
      printf("Digit: %s is not alphanumeric on line: %d\n", file, line_count);
      printf("Exiting program!\n");
      return EXIT_FAILURE;
  }

Edit2:
これは Posix エンジンですか? regcomp() が返すエラー コードは何ですか? cflag パラメータの 1 つとして REG_EXTENDED を設定する必要があります。
残念ながら、この(?: pattern )構文は拡張仕様です。

台所の流しをそれに投げるかもしれません
REG_EXTENDED | REG_NEWLINE

これらの flaq を試して、
"^\\s*[a-zA-Z0-9]+(?:\\s+[a-zA-Z0-9]+)*\\s*$"直接 regcomp() に挿入してください

これは、エラー コードに役立ちます。

 int res_compile = 0;
 if ( (res_compile=regcomp(&regex, to_find, REG_EXTENDED) ) != 0)
 {
   fprintf(stderr, "Failed to compile regex '%s'\nError code:  %d\n", to_find, res_compile);
 }

原文:たぶんあなたが必要です

 # ^\s*[a-zA-Z0-9]+(?:\s+[a-zA-Z0-9]+)*\s*$

 ^ 
 \s* 
 [a-zA-Z0-9]+ 
 (?: \s+ [a-zA-Z0-9]+ )*
 \s* 
 $

または

 # \A[^\S\r\n]*[a-zA-Z0-9]+(?:[^\S\r\n]+[a-zA-Z0-9]+)*\s*\z

 \A 
 [^\S\r\n]* 
 [a-zA-Z0-9]+ 
 (?: [^\S\r\n]+ [a-zA-Z0-9]+ )*
 \s*
 \z
于 2013-09-15T17:43:36.687 に答える