2012-12-04 2 views
1

"foo = % d"형식으로 문자열을 구문 분석해야하는데 형식이 올바른지 확인하고 int 값을 읽어야합니다.sscanf로 전체 문자열 제어

int foo_set = 0; 
int foo; 
if (sscanf(text, "foo=%d", &foo) == 1) 
    foo_set = 1; 

그러나 코드는 "foo는 = 5 $ % £"로 입력을 거부해야합니다

내 최초의 코드이었다. 이 코드가 작동합니까?

int foo_set = 0; 
int foo; 
char control; 
if (sscanf(text, "foo=%d%c", &foo, &control) == 1) 
    foo_set = 1; 

control 문자를 사용하면 추가 입력이 없음을 확인합니다. 더 정확한 방법이 있습니까?

감사

+1

'이 코드가 효과가 있습니까? ' 왜 달리고 보지 그래? – axiom

답변

6

어디 처리가 종료 결정하기 위해 %n 형식 지정자를 사용하고 문자열의 길이와 일치 확인 :

C99 표준에서 형식 지정자 n에 대한
const char* text = "foo=4d"; 
int pos; 
int foo; 

if (sscanf(text, "foo=%d%n", &foo, &pos) == 1 && 
    pos == strlen(text)) 
{ 
    /* Valid as all of text consumed. */ 
} 

설명 :

입력이 소비되지 않습니다. 해당 인수는 에 대한 포인터 여야하며 fscanf 함수을 호출하여 지금까지 입력 스트림을 에서 읽은 문자 수로 씁니다. % n 지시어를 실행해도 fscanf 함수의 실행 완료시 반환 된 할당 횟수가 증가하지 않습니다. 아무런 인수도 변환되지 않고 하나가 소비됩니다. 변환 지정에 문자 또는 필드 너비가 표시되지 않는 할당이 포함 된 경우 동작은 정의되지 않습니다.

https://ideone.com/d1rhPf에서 데모를보십시오.

+1

리눅스의'scanf' man 페이지에 따르면 사실인지 최신인지 모르겠습니다 :'C 표준에 따르면 : % n 지시어를 실행해도 완료 시점에 반환 된 할당 카운트가 증가하지 않습니다. 처형 "하지만 정오표는이 사실을 모순하는 것처럼 보인다. 아마도 % n 변환이 반환 값에 미치는 영향에 대한 가정을하지 않는 것이 좋습니다. ' – interjay

관련 문제