2

我正在解析 C 程序匹配特定关键字的文件,这是我的示例代码...

#include <stdio.h>

int main() { 

    FILE *infile = fopen("Somefile.txt", "r");

    char buffer[256];
    char value[128];

    while (fgets(buffer, sizeof(buffer), infile))
        if (1 == sscanf(buffer, " x = %s", value))
            printf("Value = %s\n", value);
    return 0;
}

一些文件.txt

some junk
#a comment
a = 1 ; a couple other variables.
b = 2
x = 3
 x = 4
x=5
x = Hi hello

输出:

Value = 3
Value = 4
Value = 5
Value = Hi

问题:当 x 包含像“Hi Hello”这样的值时,它只解析“Hi”,我想解析 x 的整个值而不丢失空间。

请建议我解决方案。

谢谢。

4

2 回答 2

2

在这行代码中:

if (1 == sscanf(buffer, " x = %s", value))

%s意思是一口气读完。

如果您想阅读该行的其余部分,请%[^\n]s像这样使用:

if (1 == sscanf(buffer, " x = %[^\n]s", value))
于 2012-03-21T05:07:07.300 回答
0

首先要做的是退出 sscanf。如果您阅读手册页,scanf 将空格视为说明“您将在此处有一些空白,这并不重要”的规范。然后其他字符是文字​​的规范。结果是该格式规范类似于“任意数量的空白,然后是 x,然后是更多的空白,然后是 '=',然后是更多的空白,然后是字符串,现在返回字符串。”

你在这里真正想做的是一些轻量级的解析。您可能会更好地阅读每一行并使用简单的有限状态机对其进行扫描,即

while not end of file
   while not end of line
      get next character
      if char == ";" -- comment
         break
      if char is a letter
         parse an assignment

等等。

于 2012-03-21T05:07:24.873 回答