【问题标题】:Specific string recognition and extraction特定的字符串识别和提取
【发布时间】:2012-01-13 19:37:44
【问题描述】:

我有一个这样的数字文件:XXX 是未知数字

XXX


YY YYYY YYY YYYY
YYYY YYY YY YYY
ZZZ
UUU UU UUUU UUUUUU UU UUUU
UU UUU UUUU U

每行的数字数量和“行号”的数量是未知的。 我只知道有多少“块”。 (其中一个块是一个数字,后跟几个数字行)

我的目标是: - 提取 XXXX 并用它填充标签 - 将“行号”标记为数字并用它归档我的矩阵

我还没有。 我读了一行,但不知道是单个数字还是一行数字。

我尝试使用 sscanf 来确定是只有一个数字还是多个数字,但这不是决定性的。我还检查了 ret 的值,但 sscanf 总是返回数字 1。 所以不可能确定是否不止一个数字。

ret = sscanf(line, "%d");

我不想使用 PCRE。我确信可以使用标准 c 库来实现它,但是如何实现呢?如何从 char* 中区分这两种线?

谢谢,对不起我的英语:)

【问题讨论】:

  • 在linux中使用tube应该是最简单的方法
  • atoi 对我来说很好,我的主要问题是区分一条有 1 个数字的行和一条不止一次的行(因为它们的结构不同)每个“块”都像我调用它们是我过程中的一个迭代。

标签: c string strtok scanf


【解决方案1】:

如果您的行分隔符是换行符 (\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

【讨论】:

  • 这是一种有趣的方式,但我搜索的主要内容是识别文件的一行是否包含 1 个或多个数字,您的示例读取一行并得到 1234,这是一个数字,所以我输入它进入我的标签,我将以下每个数字放入我的矩阵 mat[i][0] = 234,mat[i][1] = 567 等。现在,我看到一个 9(一行上的单个数字)所以我把它进入我的选项卡 tab[i+1] = 9 并且所有以下数字将进入 mat[i+1][0] 等,尤其是我想要实现的具有 1 个或多个数字的行之间的这种识别。目前,我每行读取所有文件行。
  • 您仍然可以使用这种方法,您只需保留递增行和单词的计数器以填充二维数组。当你点击一个空格时,你会增加单词计数器。当您点击换行符时,您会增加行计数器并重置字计数器。这只是几个额外的unsigned int 变量和另一个级别的if-else 语句来辨别字符是换行符还是空格。没有太多可调整的。希望这可以帮助您入门。
  • 是的,你是对的,我太专注于我的 read_line 函数。无论如何,非常感谢:)
猜你喜欢
  • 2020-02-18
  • 1970-01-01
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 2013-07-15
  • 2018-04-19
相关资源
最近更新 更多