2013-11-26 2 views
3

문자열을주는 형식과 비교하고 싶습니다.sscanf를 사용하여 문자열 형식 확인

내가 수표에 사용할 형식은 다음과 같습니다

if (sscanf(stin,"%*[^:]://%*[^:]:%*[^@]@") == 0) { ... } 

은 0으로 scanf와의 반환을 비교할 올바른 :

"xxx://xxx:[email protected]" // all the xxx are with variable length 

그래서 나는 다음과 같은 sscanf()를 사용 이 경우?

+2

대신 strtok을 사용하는 것이 더 튼튼 할 것이라고 생각합니다. 예를 들어 문자열에 무엇이 잘못되었는지 말할 수 있습니다. 도메인 이름이 누락되었습니다 –

+0

이 질문을 참조하십시오 : http://sackoverflow.com/q/726122/694576 및 URL/URI를 분석/검사하는 대체 접근 방법에 대한 답변. – alk

답변

1

모든 필드가 일치하면 0이됩니다. 하지만 그건 당신에게 실제로는 쪼그리고 앉아서 말하는 것이 아닙니다. 첫 문자에 콜론이 표시되지 않고 계속 0을 반환 할 수 있습니다.

거기에 적어도 하나의 전환이 필요합니다 (%n은 계산되지 않음). 전에 무엇이 또한 일치 한 갔다. 후행 컨텍스트 (마지막 변환 지정 이후의 데이터)가 일치하는지 결코 알 수 없으며, 백업 후 후행 컨텍스트가 일치 할 수 있다고하더라도 sscanf()은 데이터를 변환 한 경우 백업하지 않습니다.

시나리오에 대한

, 그 수 있습니다 :이 @ 후 적어도 하나 개의 문자를 필요로

char c; 
int n; 

if (sscanf(stin, "%*[^:]://%*[^:]:%*[^@]@%n%c", &n, &c) == 1) 

. 또한 @까지 포함 된 문자의 수를 알려줍니다.

+0

그리고 그것은 마지막 하나 여야합니다! –

0

OP님께 서 제안을드립니다.

@Jonathan Leffler는 지정자가없는 sscanf()의 결과를 0과 비교하는 것이 일치 항목과 일치하지 않는 항목을 구별하지 않는다는 점에서 정확합니다. 이것을 이용하여 모호한 구멍있다

int n = 0; 
sscanf(stin, "%*[^:]://%*[^:]:%*[^@]@%*c%n", &n); 
if (n > 0) { 
    match(); 
} 

를 사용하여, (적어도 1 매칭을 필요로하고 "X"가있는 부분을 가정), "XXX에서 @의 XXXXXX : // XXX를 XXX"

은 테스트 할 방법은 fscanf()입니다. \0이있는 데이터 스트림이 문제입니다.