[英]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
記住, [
和]
對實際上形成轉換說明符,它們需要相應的參數才能保存掃描結果。
建議:
您目前所擁有的:
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.