2016-11-24 53 views
3

例如考慮C字符串數組,所有的數字sscanf可以用來匹配通配符嗎?

..."12334", "21335", "24335"... 

,我想知道如何這些字符串的很多比賽這個通配符掩碼

**33* (where * = any digit 0-9) 

我可以用sscanf(str, mask, ...)做到這一點?格式"%1d%1d%[3]%[3]%1d"似乎比我想要的要多(當33不在那裏時)和"%1d%1d33%1d"似乎表現得很奇怪,匹配一些但不是全部匹配的條目。

上下文在我的代碼:

if (sscanf(array[i], mask, &a1, &a2, &a3) == 3) 

3被的通配符的數字位數匹配。

+0

你能顯示你的完整代碼,包括檢查返回值嗎?使用'argv [1]'作爲'sscanf()'的第一個參數的'int main()'的程序是完美的。 –

+0

@John Zwinck我添加了用於檢查的行。 'mask'是我描述的格式,'a1,a2,a3'是32位'int's。我真的只是問,如果'sscanf'能夠完成我所描述的內容,以及格式應該是什麼 –

+0

@jefferson你有幾個選擇。 1)濫用strchr以確保字符串中的第一次和第二次出現在您想要的地方。 2)手工製作整數,以便可以匹配每種可能的組合。 – Chirality

回答

4

格式"%1d%1d33%1d"應該是正確的,假設您的輸入都是數字。但是你還沒有告訴我們什麼特定輸入失敗。您應該考慮字符串"1 2334"" 1\n\n233 \t 4"實際上會匹配,因爲%d會吃掉空白直到找到一個整數。

請注意,如果你使用"%2d33%1d"這會更糟,因爲2個字符的整數可以是具有負單個數字。

如果它尚未可知,使用sscanf對於這種類型的匹配的不合適。你最好使用正則表達式庫,這在這種事情上很出色。

然而,迄今爲止最簡單的方法,如果你只是想要快速的作品,是與isdigit一起使用短路計算。你甚至不需要檢查字符串長度:

int matches(const char * s) 
{ 
    return s 
     && isdigit(s[0]) 
     && isdigit(s[1]) 
     && '3' == s[2] 
     && '3' == s[3] 
     && isdigit(s[4]); 
} 
+2

還有一個額外的問題,如果要匹配的字符串或逗號或空格中有雙引號,那麼與整數相關的格式字符串將不會跳過引號;它會簡單地將它們拒絕爲不符合格式。我同意'sscanf()'不適合這項工作。 –