我有一个这样的数字文件:XXX 是未知数字
XXXX
YY YYYY YYY YYYY
YYYY YYY YY YYY
ZZZ
UUU UU UUUU UUUUUU UU UUUU
UU UUU UUUU U
每行的数字个数和“行号”的个数未知。 我只知道有多少个“ block ”。 (其中一个 block 是一个数字,后跟几条数轴)
我的目标是: - 提取 XXXX 并用它填充一个选项卡 - 将“行号”标记为数字并用它来归档我的矩阵
我还拥有什么。 我读了一行,但不知道它是单个数字还是一行数字。
我尝试使用 sscanf 来确定是否只有一个数字或多个数字,但这并不是结论性的。我还检查了 ret 的值,但 sscanf 总是返回数字 1。 因此无法确定是否有多个数字。
ret = sscanf(line, "%d");
我不想使用 PCRE。我确信可以使用标准 c 库来实现它,但是如何实现呢?如何从 char* 中区分两种线?
谢谢,抱歉我的英语不好:)
最佳答案
如果您的行分隔符是换行符 (\n
) 并且标记分隔符是空格 (\s
),则一次将一个字符读入缓冲区。
一旦点击任一分隔符,终止缓冲区,打印它,重置缓冲区的索引,然后继续读取文件以找到下一个分隔符。
这里有一些代码可以做到这一点:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
INT_MAX is 2147483647, and so the maximum digit
length is 10. We add another digit to hold a
null terminator.
*/
static const unsigned int kMaxNumberLength = 11;
static const char *kNumberFilename = "numbers.txt";
int main(int argc, char *argv[])
{
FILE *fp = NULL;
char currC, buffer[kMaxNumberLength];
unsigned int cIndex = 0U;
fp = fopen(kNumberFilename, "r");
if (fp) {
do {
currC = fgetc(fp);
buffer[cIndex] = currC;
if ((currC == ' ') || (currC == '\n')) {
buffer[cIndex] = '\0'; /* terminate buffer */
fprintf(stdout, "found number: %d\n", atoi(buffer));
cIndex = 0U;
continue;
}
cIndex++;
} while (currC != EOF);
fclose(fp);
}
else
return EXIT_FAILURE;
return EXIT_SUCCESS;
}
假设您有以下文件numbers.txt
:
1234
234 567 1
4 5
9
让我们编译并运行代码:
$ gcc -Wall test.c
$ ./a.out numbers.txt
found number: 1234
found number: 234
found number: 567
found number: 1
found number: 4
found number: 5
found number: 9
关于c - 具体字符串识别和提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8856229/