簡體   English   中英

使用分隔符“ _”讀取輸入fscanf

[英]Read input fscanf with delimiter “_”

如何在txt文件中掃描以下內容?

number_name_name1_number2

例如:

12_whoever_alternative with spaces_31

我試過了:

fscanf(f, "%d %[^_]_ %s %[^_]_ %s %[^_]_ %d", &number, name, name1, &number2)

首先,就目前的代碼而言,您的行為尚未定義

引用C11 ,第§7.21.6.2章

如果沒有足夠的參數用於格式,則行為未定義。

如您所見,

fscanf(f, "%d %[^_]_ %s %[^_]_ %s %[^_]_ %d", &number, name, name1, &number2)
         |=================================|   |=============================|
               7 conversion specifiers                only 4 arguments!!!
                 in the format sting

記住, []對實際上形成轉換說明符,它們需要相應的參數才能保存掃描結果。

建議:

就是說,您可能想使用fgets()讀取數據,並使用strtok()將輸入標記化以獲取各個標記。

您目前所擁有的:

fscanf(f, "%d %[^_]_ %s %[^_]_ %s %[^_]_ %d", &number, name, name1, &number2)

先匹配一個數字,后跟一個空格,然后是一系列不包含下划線的字符,然后是下划線和空格等,因此完全不符合您的實際期望。 另外,每個%...都希望有一個相應的變量來存儲值。

要獲得想要的東西,您需要以下內容。

fscanf(f, "%d_%[^_]_%[^_]_%d", &number, name, name1, &number2);

並且不要忘記檢查返回的值-小於4的值表示找不到所有4個值。

如果必須為此使用fscanf() ,則應使用以下格式:

fscanf(f, "%d_%[^_]_%[^_]_%d", &number, name, name1, &number2);

假定分隔符為單個下划線,並且不容納兩個為空的字符串。 確實在每個數字之前都包含前導空格(將被忽略),並且兩個字符串將允許跨行。 這兩個潛在的問題都可以解決,盡管在數字之前拒絕空格需要使用%[指令而不是%d,從而掃描到字符串。

總體而言,這可能比它值得的麻煩多得多。 通常,編寫自己的解析函數要比依靠scanf()函數處理最簡單的格式化要好。

暫無
暫無

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

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