我正在使用 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(®ex, 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(®ex, 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() 但我的任务是使用正则表达式。这个问题的可能解决方案是什么?谢谢你的建议。
编辑:我想提一下,当我使用 fscanf 而不是 fgets 时,上面的正则表达式工作得很好。更改的原因是我需要计算每一行。如果我是正确的, fscanf 会忽略换行符。我需要一些方法来计算换行符。是否可以使用 fscanf 计算一个新的?我原来的文件读取循环是:
while (fscanf(fp, "%11023s", file) != EOF
{
line_count++;
if (regexec(®ex, file, 0, NULL, 0) != 0)
{
printf("%s%d wrong:\n, file, line_count);
return EXIT_FAILURE;
}
}