使用fscanf检测引用的字符串

时间:2014-07-21 14:10:26

标签: c regex strcmp

我想在C中读取这样一个文件的内容:

foo="bar"
alice="bob"
fruit="pineapple"

我对与 alice 键相关的特定值感兴趣,但没有周围的引号。所以,我想要 bob

所以,我写过这样的东西

编辑:添加了键/值的printf

char key[20];
char value[20];
char output[20];

memset(key, 0, 20);
memset(value, 0, 20);

while(fscanf(fd, "%19[^=]=\"%19[^\"]\"", key, value) != EOF) {

    printf("%s=%s", key, value);

    if (strcmp(key, "alice") == 0) {
      memset(output, 0, 20);
      strncpy(output, value, 20);
      break;
    }

    memset(key, 0, 20);
    memset(value, 0, 20);
}

问题是strcmp永远不会返回0.因此,任何键和“alice”之间的比较总是错误的。我得到了这个输出:

foo=bar
alice=bob
fruit=pinneaple
=pineapple

还通过strlen测试了每个键的长度,这是正确的。除了最后一行,我得到了我的期望。所以,我真的不明白......

这里有明显的错误吗?我正在尝试调试代码,但我正在使用非常有限的目标系统(openwrt),而且我无法访问gdb(实际上,代码是在另一台机器上交叉编译的,因为我的目标是甚至没有编译器。)

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

不要将scanf()用于用户输入(即使它来自文件)。 喜欢fgets()

你的问题在于空白。

该文件的内容包括'\n''\n'中包含key

如果您想继续使用fscanf(),请尝试在转换字符串中添加一些空格:

while (fscanf(fd, " %19[^=]= \"%19[^\"]\"", key, value) == 2) /* ... */;
//                 ^        ^ (2nd one isn't as important)

另请注意我改变了条件。 而不是针对EOF进行测试,而是测试返回值2