[英]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
模式語法方面的專家,但我對你的解釋是:
'@'
字符的非空序列 ';'
人物 所以是的,如果你的字符串以'@'
開頭,那么第一部分就會失敗。
我想如果你用一些空格開始你的格式字符串,那么fscanf
會fscanf
數據字符串中的任何前導空格,即只是" %8999[^;]"
。
奧利已經說過為什么fscanf失敗了。 由於故障是fscanf的正常狀態,因此繁忙的循環不是fscanf故障的結果,而是缺少處理的結果。
即使您的格式正確(在您的特殊情況下),您也必須處理fscanf故障,因為您無法確定輸入始終是否可以通過格式匹配。 實際上,您可以確定存在比匹配輸入更多的不匹配輸入。
您的格式字符串執行以下操作:
@
字符 ;
人物 不幸的是,沒有格式說明符用於從用戶定義的集合中讀取“零個或多個”字符。
如果您不關心某一行上的多個@include語句,您可以將代碼更改為讀取單行(使用fgets),然后從中提取@include語句(如果第一個字符不等於@
,則為可以使用sscanf的當前格式字符串,否則,您可以使用sscanf(line, "%8999[^;]", buffer)
)。
如果應該正確處理一行上的多個@include狀態,則可以使用getc
檢查要讀取的下一個字符,然后將其與ungetc
放回。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.