読み取り文字列に含めることができる文字に関しては、非常に厳密にする必要があります。
一連の空白の後に文字が続き、一連の空白が続きます。
例: " c "
、"c"
、""
、" "
文字を無視できるフォーマット指定子を見つける必要がありますが、それがこの特定の文字であり、他の文字ではない場合に限られます。このシーケンス" e "
は中止する必要があります。
試してみ" %*[c] "
ましたが、一部のシナリオで単体テストが失敗するため、 0 個以上ではなく" %*[c] "
1 個以上を探していると思い込んでしまいました。'c'
'c'
私の問題をよりよく説明するのに役立つ小さな例を書きました。これは最小限の例にすぎないことに注意してください。中心的な問題は、ゼロまたは単一文字の量をどのように解析するかです。
#include <stdio.h>
#include <string.h>
unsigned match(const char * formula){
unsigned e = 0, found = 0, s;
char del;
int parsed, pos, len = (int) strlen(formula);
const size_t soc = sizeof( char );
del = ' ';
parsed = sscanf_s( formula, " \" %*[(] X%*[^>]>> %u %*[)] %c %n", &s, &del, soc, &pos );// (X >> s )
if( ( 2 == parsed ) && ( pos == len) && ( '"' == del ) ){
printf("%6s:%s\n", "OK", formula);
}else{
printf("%6s:%s\n", "FAIL", formula);
e += 1;
}
return e;
}
unsigned main( void )
{
unsigned e = 0;
printf("SHOULD BE OK\n");
e += match(" \"X >> 3\""); //This one does not feature the optional characters
e += match(" \"( X >> 3 ) \"");
e += match(" \"( X >> 3 ) \"\r");
printf("SHOULD FAIL\n");
if ( 0 == match(" \"( Y >> 3 ) \"") ) e += 1;
if ( 0 == match(" \"g X >> 3 ) \"") ) e += 1;
if ( 0 == match(" \"( X >> 3.3-4.2 ) \"") ) e += 1;
if( 0 != e ){ printf( "ERRORS: %2u\n", e ); }
else{ printf( "all pass\n", e ); }
return e;
}