gpt4 book ai didi

C: fscanf - 第一个字符匹配时无限循环

转载 作者:行者123 更新时间:2023-12-02 00:37:55 27 4
gpt4 key购买 nike

我正在尝试使用 fscanf 解析一个文本 (CSS) 文件并提取所有匹配此模式的语句:

@import "some/file/somewhere.css";

为此,我设置了以下循环:

FILE *file = fopen(pathToSomeFile, "r");
char *buffer = (char *)malloc(sizeof(char) * 9000);

while(!feof(file))
{
// %*[^@] : Read and discard all characters up to a '@'
// %8999[^;] : Read up to 8999 characters starting at '@' to a ';'.
if(fscanf(file, "%*[^@] %8999[^;]", buffer) == 1)
{
// Do stuff with the matching characters here.
// This code is long and not relevant to the question.
}
}

只要文件中的第一个字符不是“@”,它就可以完美运行。 (从字面上看,CSS 文件中第一个“@”字符前的单个空格将使代码运行良好。)

但是如果 CSS 文件中的第一个字符是“@”,那么我在调试器中看到的是一个无限循环——执行进入 while 循环,命中 fscanf 语句,但不进入“if” ' 语句(fscanf 失败),然后一直循环下去。

我相信我的 fscanf 格式化程序可能需要一些调整,但我不确定如何继续。对于为什么会发生这种情况,有什么建议或解释吗?

谢谢。

最佳答案

我不是 scanf 模式语法方面的专家,但我对你的解释是:

  • 匹配非'@'字符的非空序列,然后
  • 匹配最多 8999 个非 ';' 字符的非空序列

是的,如果您的字符串以 '@' 开头,那么第一部分将失败。

认为如果您的格式字符串以一些空格开头,那么 fscanf 将吃掉您数据字符串中的任何前导空格,即简单的 "%8999[ ^;]".

关于C: fscanf - 第一个字符匹配时无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3829254/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com