2012-11-21 1 views
25

나는 문자열 (A char*를) 구문 분석 그리고 난, 복식로 문자열에서 숫자를 구문 분석과 같이 할 sscanf을 사용하고 있습니다 :sscanf가 읽는 문자 수를 얻으시겠습니까?

// char* expression; 
double value = 0; 
sscanf(expression, "%lf", &value); 

이 잘 작동하지만 다음 구문 분석을 계속하고 싶습니다 종래의 방법으로 문자열. 얼마나 많은 문자가 sscanf에 의해 파싱 되었는가를 알아야만 새로운 오프셋에서 수동 구문 분석을 재개 할 수 있습니다.

물론, 가장 쉬운 방법은 어떻게 든 문자 sscanf 파싱의 수를 계산하는 것이나, 할 수있는 간단한 방법이 존재하지 않는 경우는, 그 I 대안 더블 분석 옵션에 개방 오전. 그러나, 현재는 sscanf을 사용하고 있습니다. 빠르고 간단하고 읽기 쉽기 때문입니다. 어쨌든, 나는 double을 평가하고 그 후에 파싱을 계속하는 방법이 필요하다.

답변

39

당신은 형식 지정자 %n을 사용하고 sscanf()에 추가 int * 인수를 제공 할 수있는 다음 C99 표준에서 형식 지정자 n에 대한

int pos; 
sscanf(expression, "%lf%n", &value, &pos); 

설명 :

없음 입력이 소모되지 않습니다. 해당 인수는함수을 호출하여 지금까지 입력 스트림에서 읽은 문자 수로 쓰여질 부호있는 정수의 포인터 여야합니다. %n 지시문을 실행해도 fscanf 함수의 실행 완료시 반환되는 할당 횟수가 증가하지 않습니다. 인수는 변환되지 않지만 하나는 사용됩니다. 변환 지정에 문자 또는 필드 너비가 지정되어 있지 않으면 동작은 정의되지 않습니다.

항상 할당이 이루어졌다되도록 sscanf()의 반환 값을 확인하고, 다음의 코드는 그 값에 변화가 없었다 실수 프로세스 변수 수행하지 :

/* Number of assignments made is returned, 
    which in this case must be 1. */ 
if (1 == sscanf(expression, "%lf%n", &value, &pos)) 
{ 
    /* Use 'value' and 'pos'. */ 
} 
+0

[Microsoft 구현] (https://msdn.microsoft.com/en-us/library/t6z7bya3.aspx?f=255&MSPPError=-2147217396)과 같이 작동하지 않는 것처럼 보일 수 있습니다. sscanf_s (p, "% s % d \ n % n", toString, (int) _countof (toString), & itemCount, &pos);''pos '가 전혀 변경되지 않은 것 같습니다. – c00000fd

2
int i, j, k; 
char s[20]; 

if (sscanf(somevar, "%d %19s %d%n", &i, s, &j, &k) != 3) 
    ...something went wrong... 

가변 k 캐릭터 수를 포함을 j에 저장된 정수의 끝이 스캔 된 지점까지.

%n은 성공적인 전환으로 계산되지 않습니다. 필요한 경우 형식 문자열에서 %n을 여러 번 사용할 수 있습니다.