漫談sscanfの高度な特性

1707 ワード

フォーマット出力API、printf、sprintf、vsprintfなどはすでに知られており、使用規則も手のひらのように知られています.
例えば%d,%s,%p,%02 dなど;
 
sscanfはかなり使われていませんが、その使い方はよく使われる%d、%s、%cなどのほかに「^」、「[」、「]」、「*」などがあります.
1.「^」は正規表現の^作用と一致し、非に相当する.
2.「[」,「]」は、正規表現の[,]と同様に、値の範囲に相当するペアで使用されます.
3.「*」は無視を表し、正規表現の*とN個の類似値をとる作用に違いがある.
 
関数のプロトタイプ:
 int sscanf_s(    const char *buffer,    const char *format [,    argument ] ... );
 
戻り値は、一致するフィールドの数を表します.
 
例を見てみましょう.
 
	const char* src = "1234_abc_";
	char szDst[32];
	int iDst;
	sscanf(src,  "%d", &iDst);				//<! 1)
	sscanf(src,  "%c", szDst);				//<! 2)
	sscanf(src,  "%s", szDst);				//<! 3)
	sscanf(src,  "%2s", szDst);				//<! 4)
	sscanf(src,  "%[^_]", szDst);			//<! 5)
	sscanf(src,  "%*[0-9_]%[^_]", szDst);		//<! 6)
	sscanf(src,  "%d%s", &iDst, szDst);			//<! 7)
	sscanf(src,  "%d_%s", &iDst, szDst);			//<! 8)

 
第1例:整形をフォーマットし、非デジタル範囲のasciiコードに遭遇したときにマッチングを停止し、iDst=1234;
第2の例:フォーマットバイト、1バイトのみフォーマット、szDst=1、後の31バイトは配列を初期化するときのデフォルト値です.
3つ目の例:文字列のフォーマット、szDst=1234_abc_ そして'0'で終わる.
4つ目の例:固定長文字列をフォーマットします.szDst=12です.長さが最も長いフォーマットが2つ指定されているため、%2 sです.
5つ目の例:文字列マッチングのフォーマットの場合は一致を停止し、szDst=1234
6つ目の例:文字列をフォーマットし、一致を無視し、0~9と_を無視します.文字、および_の場合は一致を停止し、szDst=abc
 
以上の例はいずれも同時に1つだけ一致している.複数に一致する場合は?単純加和と言える
7つ目の例では、整形と文字列をフォーマットし、iDst=1234、szDst=abc_
第8例、同時に整形、ジャンプフォーマット文字列をフォーマットし、iDst=1234、szDst=abc、中間の_ジャンプされました.
 
この関数に加えて、対応するバリエーションsscanf_があります.l,wバージョンなど.