簡體   English   中英

C:fscanf - 第一個字符匹配時的無限循環

[英]C: fscanf - infinite loop when first character matches

我試圖使用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非';' 人物

所以是的,如果你的字符串以'@'開頭,那么第一部分就會失敗。

如果你用一些空格開始你的格式字符串,那么fscanffscanf數據字符串中的任何前導空格,即只是" %8999[^;]"

奧利已經說過為什么fscanf失敗了。 由於故障是fscanf的正常狀態,因此繁忙的循環不是fscanf故障的結果,而是缺少處理的結果。

即使您的格式正確(在您的特殊情況下),您也必須處理fscanf故障,因為您無法確定輸入始終是否可以通過格式匹配。 實際上,您可以確定存在比匹配輸入更多的不匹配輸入。

您的格式字符串執行以下操作:

  • 讀取(並丟棄)1個或多個非@字符
  • 讀取(並丟棄)0個或更多空格字符(由於格式字符串中的空格)
  • 讀取並存儲1到8999非; 人物

不幸的是,沒有格式說明符用於從用戶定義的集合中讀取“零個或多個”字符。

如果您不關心某一行上的多個@include語句,您可以將代碼更改為讀取單行(使用fgets),然后從中提取@include語句(如果第一個字符不等於@ ,則為可以使用sscanf的當前格式字符串,否則,您可以使用sscanf(line, "%8999[^;]", buffer) )。

如果應該正確處理一行上的多個@include狀態,則可以使用getc檢查要讀取的下一個字符,然后將其與ungetc放回。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM