2016-11-24 26 views
3

は、すべての桁ワイルドカードの照合にsscanfを使用できますか?例えば

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

、C文字列の配列を考えると、私は、このワイルドカードは

**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

戻り値のチェックを含め、完全なコードを表示できますか? sscanf()の最初の引数として 'argv [1]'を使った 'int main()'のプログラムは完璧です。 –

+0

@John Zwinckチェックに使用した行を追加しました。 'mask 'は私が記述した書式です、' a1、a2、a3'は32ビット 'int'です。私は本当に 'sscanf'が私が記述したことを実行できるのか、そして何のフォーマットでなければならないのかという質問だけです。 –

+0

@jeffersonあなたはいくつかの選択肢があります。 1)文字列の最初の出現と2番目の出現があなたの望む場所にあることを確認するためにstrchrを乱用してください。 2)可能なすべての組み合わせに一致するように整数を手作業で作成します。 – Chirality

答えて

4

入力がすべて数字であると仮定すると、"%1d%1d33%1d"の形式は正しいはずです。しかし、あなたは私たちに語っていない何が特定の入力が失敗している。文字列"1 2334"" 1\n\n233 \t 4"は、%dが整数を見つけるまで空白を食べるので、実際には一致すると考えるべきです。

"%2d33%1d"を使用する場合、2文字の整数は負の1桁になる可能性があるため、これはさらに悪化することに注意してください。

このタイプの一致に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()'が仕事の正しいツールではないことに同意します。 –

関連する問題