簡體   English   中英

fscanf()可以讀取空格嗎?

[英]Can fscanf() read whitespace?

我已經有了一些使用fscanf()讀取文本文件的代碼,現在我需要對其進行修改,以便之前沒有空格的字段需要允許空白。 文本文件基本上是以下形式:

標題:數據
標題:數據
等等...

基本上是用fgets(inputLine, 512, inputFile); sscanf(inputLine, "%*s %s", &data);解析的fgets(inputLine, 512, inputFile); sscanf(inputLine, "%*s %s", &data); fgets(inputLine, 512, inputFile); sscanf(inputLine, "%*s %s", &data); ,讀取DATA字段並忽略標題,但現在一些數據字段需要允許空格。 我仍然需要在它之后立即忽略標題和空格,然后讀取包括空格在內的其余行。

無論如何使用sscanf()函數執行此操作?

如果沒有,我可以對代碼進行哪些最小的改變來正確處理空白?

更新:我編輯了用fgets()+ sscanf()替換fscanf()的問題,這是我的代碼實際使用的。 當我第一次寫這個問題時,我並不認為它是相關的,這就是我將它簡化為fscanf()的原因。

如果你不能使用fgets()使用%[轉換說明符(帶有“exclude option”):

char buf[100];
fscanf(stdin, "%*s %99[^\n]", buf);
printf("value read: [%s]\n", buf);

fgets()更好。


編輯:版本與fgets() + sscanf()

char buf[100], title[100];
fgets(buf, sizeof buf, stdin); /* expect string like "title: TITLE WITH SPACES" */
sscanf(buf, "%*s %99[^\n]", title);

我強烈建議你停止使用fscanf()並開始使用fgets() (讀取整行),然后解析已讀取的行。

這將使您在解析非精確格式的輸入方面具有更大的自由度。

最簡單的事情是發出一個

fscanf("%*s");

丟棄第一部分然后只需調用fgets:

fgets(str, stringSize, filePtr);

如果您堅持使用scanf ,並假設您希望換行符作為終止符,則可以執行以下操作:

scanf("%*s %[^\n]", str);

但請注意,完全按照書面形式使用的上述內容是一個壞主意,因為沒有什么可以防止str溢出(因為scanf不知道它的大小)。 當然,您可以設置預定義的最大大小,並指定該大小,但是您的程序可能無法在某些有效輸入上正常工作。

如果輸入格式定義的行的大小不受限制,那么您唯一可行的選擇是使用fgetc按char讀取數據char,定期重新分配緩沖區。 如果你這樣做,那么修改它以刪除所有讀取字符,直到第一個空格是相當微不足道的。

fscanf中的%s說明符會跳過輸入上的任何空格,然后讀取一串非空白字符,最多不包括下一個空白字符。

如果要讀取換行符,可以使用%[^\\n]作為說明符。 另外,格式字符串中的''將跳過輸入上的空格。 所以,如果你使用

fscanf("%*s %[^\n]", &str);

它將讀取第一個空白行的第一個東西(在你的情況下為“title:”),扔掉它,然后將讀取空白字符並將它們扔掉,然后讀取所有字符到新行到str ,這聽起來像你想要的。

小心str不會溢出 - 你可能想要使用

fscanf("%*s %100[^\n]", &str)

限制你將讀取的最大字符串長度(100個字符,不包括終止NUL)。

你正在*scanf系列有利的限制。 只需極少的更改,您就可以嘗試使用Dave Hanson的C接口和實現中的字符串掃描模塊。 這個東西是編程語言Icon的改進,這是一種非常簡單和強大的字符串處理語言,Hanson和其他人在亞利桑那州工作。 離開sscanf不會太嚴重,它比正則表達更簡單,更容易使用,也更強大。 唯一的缺點是代碼在沒有書的情況下有點難以理解 - 但如果你做了很多C編程,這本書非常值得擁有。

暫無
暫無

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

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