읽기 문자열에 포함될 수있는 문자와 관련하여 매우 엄격해야합니다.문자 집합에서 0 개 이상의 문자를 읽는 scanf 형식 지정자
일련의 공백이 있고 그 다음에 문자와 공백이옵니다.
예 : " c "
, "c"
, ""
는 " "
나는 나를하지만이 특정 문자가 아닌 다른 문자 경우에만 문자를 무시 할 수있는 형식 지정자를 찾을 필요가있다. 이 시퀀스 " e "
은 중단되어야합니다.
" %*[c] "
시도했지만 내 unittests은 일부 시나리오 실패 -
" %*[c] "
하나 이상의 대신에 0 개 이상의
'c'
의
'c'
을 찾고 믿고 저를 선도.
나는 내 문제를 더 잘 설명하는 데 도움이되는 간단한 예를 썼다. 이것은 단지 최소한의 예에 불과하다는 것을 명심하십시오. 가장 중요한 문제는 어떻게 0 또는 하나의 문자 하나를 파싱하는지입니다. 이 목적을 위해 sscanf
를 사용하여 다른 사람들이 당신에 표시된 것처럼
#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;
}
'scanf '는 범용 도구가 아닙니다. 'scanf '로 원하는 것을 구현하는 것은 불가능하다고 생각합니다. 대신 정규식이나 수동 구문 분석을 사용할 수 있습니다. – anatolyg
나는 두 번째가있다, 나는 단지 이것보다 더 많은 시간을 waaay 지출 한 후에 포기했다. 살인자 인 두 번째 괄호입니다. –