c - 具体字符串识别和提取

标签 c string strtok scanf

我有一个这样的数字文件: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/

相关文章:

c++ - 将三角形带转换为三角形?

c - 如何在C中检查字符串的特定格式

c# - asp.net 不显示我在 html 中想要的字符串

python - 从字符串中删除前x个字符?

java - 如何正确比较从数据报包接收到的字符串值?

c - 使用 Strtok() 验证 CSV 文件

c - 段错误 - 文件写入

c - LLVM C API。如何确定 LLVMValueRef 是整数类型还是指针类型?

c - 从文件 C 中的单行读取多个变量类型

c - 使用 strtok() 从字符串中解析标记