2016-11-24 8 views
3

는 모든 숫자sscanf를 사용하여 와일드 카드를 일치시킬 수 있습니까? 예를 들어

..."12334", "21335", "24335"... 

, C 문자열의 배열을 고려하고 나는이 와일드 카드

**33* (where * = any digit 0-9) 

나는 이러한 목표를 달성하기 위해 sscanf(str, mask, ...)을 사용할 수 마스크 일치 얼마나 많은 이들 문자열 알고 싶어? "%1d%1d%[3]%[3]%1d" 형식은 내가 원하는 것 이상 (33이 없을 때)과 일치하는 것으로 보이며 "%1d%1d33%1d"은 일부 일치하는 항목과 일치하는 항목과 일치하는 것 같이 이상하게 작동하는 것처럼 보입니다. 내 코드에서

컨텍스트 :

if (sscanf(array[i], mask, &a1, &a2, &a3) == 3) 

(3)는 와일드 카드 자리의 수는 일치된다.

+0

반환 값 확인을 포함하여 전체 코드를 표시 할 수 있습니까? sscanf()에 대한 첫 번째 인수로'argv [1]'을 사용하는'int main()'을 가진 프로그램은 완벽 할 것입니다. –

+0

@ 존 Zwinck 나는 확인하는 데 사용되는 라인을 추가했습니다. 'mask '는 내가 설명한 형식이며,'a1, a2, a3'는 32 비트 int입니다. 'sscanf '가 내가 설명한 것을 할 수 있고 어떤 포맷이되어야 하는지를 묻는 것입니다. –

+0

@jefferson 몇 가지 옵션이 있습니다. 1) strchr을 사용하여 문자열의 첫 번째와 두 번째 항목이 원하는 위치에 있는지 확인하십시오. 2) 모든 가능한 조합을 일치시킬 수 있도록 정수를 작성하십시오. – Chirality

답변

4

입력이 모두 숫자라고 가정하면 "%1d%1d33%1d" 형식이 정확해야합니다. 그러나 당신은 우리에게 을 말하지 않았고, 무엇을 특정 입력이 실패했는지 알려주지 않았습니다. 문자열 "1 2334"" 1\n\n233 \t 4"은 실제로 일치 할 것이므로 %d은 정수를 찾을 때까지 공백을 먹을 것이기 때문에 고려해야합니다.

"%2d33%1d"을 사용하는 경우 2 문자 정수는 음수가있는 한 자리 수 있기 때문에 더 악화됩니다.

이 유형의 일치에 sscanf을 사용하는 것은 적절하지 않습니다. 이런 식으로 탁월한 정규식 라이브러리를 사용하는 것이 좋습니다.

그러나 지금까지 가장 간단한 방법은 빠른 동작을 원할 경우 isdigit과 함께 단락 회로 평가를 사용하는 것입니다. 문자열 길이를 확인할 필요조차 없습니다.

int matches(const char * s) 
{ 
    return s 
     && isdigit(s[0]) 
     && isdigit(s[1]) 
     && '3' == s[2] 
     && '3' == s[3] 
     && isdigit(s[4]); 
} 
+2

일치하는 문자열이나 쉼표 또는 공백에 큰 따옴표가 있으면 정수 관련 형식 문자열이 따옴표를 건너 뛰지 않는 추가 문제가 있습니다. 형식과 일치하지 않는 것으로 단순히 거부합니다. 나는'sscanf()'가 그 일에 적합한 도구가 아니라는 것에 동의한다. –