对于可以在读取字符串中的字符,我需要非常严格。
我有一系列空格,后跟一个字符,然后是一系列空格。
示例:" c "
, "c"
, ""
," "
我需要找到一个允许我忽略该字符的格式说明符,但前提是它是这个特定字符而不是任何其他字符。这个序列" e "
应该被中止。
我试过" %*[c] "
了,但我的单元测试在某些情况下失败了——这让我相信这" %*[c] "
是在寻找一个或多个'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;
}