2013-06-04 3 views
3

sscanf의 사용법으로 043, 21.45, 45.65, 9.34, 3.46의 값을 얻는 방법을 묻습니다. sscanf를 사용하여 반환 값

Parameters: 43 VALUES FROM 0000:0000 (043) 
Name_8:(Temp=21.45,Hum=45.65,AR=9.34,Volt=3.46V) 

I의 FROM 코드가

char str[20]; 
sscanf(buff,"%*s %*d %*s %s",str); 
printf("Results %s\n",str); 

같은 것을 알고 때까지

그리고 이것은 나에게
Results FROM 

를 반환하지만 sscanf를 계속하는 방법을 모르겠어요. 나는 매우 익숙하지 않은, 그리고 난 당신이 까다로운 :) 될 수 서길 두 번째 줄 뭔가를 시도 할 수 있습니다 등, : _()와 같은 문자를 이스케이프하는 방법을 첫 번째 줄에 들어

+1

sscanf 설명서를 읽었습니까? –

+1

나는 다음의 출처에서 그것을 이해하려고 노력했다. 그러나 그것은 단순한 문장에 대한 예를 가지고 있고 광산과는 다르다. http://www.cplusplus.com/reference/cstdio/sscanf/ – dali1985

+0

http : //에 "see also" /www.cplusplus.com/reference/cstdio/scanf/ 형식에 대한 더 많은 정보가 있습니다. 특히, "공백 문자 (공백, 개행 또는 탭) 또는 형식 지정자 (% 문자로 시작)의 일부가 아닌 문자는 함수가 스트림의 다음 문자를 읽거나이 문자와 비교합니다 공백이 아닌 문자가 있으면 일치하고 버려지며 함수는 다음 문자의 형식으로 계속됩니다. " ...이를 사용하여 입력 형식의 일정 부분을 건너 뛸 수 있습니다. –

답변

5

변경되지 않는 입력 부분은 문자 그대로 지정할 수 있으므로 % *를 생략 할 필요가 없습니다. 변형 부분은 사용하는 % * d 및 % *로 건너 뛸 수 있습니다. 이

#include <stdio.h> 

int main (void) 
{ 
    char buff[] = "Parameters: 43 VALUES FROM 0000:0000 (043)\n" 
        "Name_8:(Temp=21.45,Hum=45.65,AR=9.34,Volt=3.46V)"; 
    int tag; 
    float Temp, Hum, AR, Volt; 
    int n; 

    n = sscanf (buff, "Parameters: %*d VALUES FROM %*d:%*d (%d) " 
         "Name_%*d:(Temp=%f,Hum=%f,AR=%f,Volt=%fV)", 
         &tag, &Temp, &Hum, &AR, &Volt); 
    if (n == 5) { 
     printf ("tag = %d, Temp = %f, Hum = %f, AR = %f, Volt = %f\n", 
       tag, Temp, Hum, AR, Volt); 
    } else { 
     printf ("Couldn't scan all items (converted %d).\n", n); 
    } 
    return 0; 
} 

출력됩니다

tag = 43, Temp = 21.450001, Hum = 45.650002, AR = 9.340000, Volt = 3.460000 

를 실행하면 항상 sscanf에서의 반환 값을 확인! 당신은 쓰레기 값으로 군인 싶지 않아요. 그리고 형식의 단일 공백은 공백을 건너 뛰므로 ) 이후의 공백은 입력에서 줄 바꿈을 건너 뜁니다.

+0

만약'if' 표현식이 과제를 분리했다면 훨씬 더 좋아 보일 것입니다. – Sebivor

+0

오, 그것은 K & R, 초판에서 배운 관용구입니다. 구식이라고 불러주세요 :-) – Jens

+0

@Jens : 위에서 언급했듯이 출력은 Temp = 21.450001이됩니다. 어떻게 정밀도를 유지할 수 있습니까? 출력 21.450000 만 출력됩니다. – mario

0

를 모르는

char f1[] = "Parameters: 43 VALUES FROM 0000:0000 (043)"; 
int d = 0; 
sscanf(f1, "%*s %*s %*s %*s %*s (%d)",&d); 
printf("D %d \n", d); 
당신이 숫자 값 사이에 공간을 추가하여 같은 초를 수정할 수 있습니다 경우

다음
char f2[] = "Name_8:(Temp= 21.45,Hum= 45.65,AR= 9.34,Volt= 3.46V)"; 

이이 플로트 값 읽는 데 사용할 수 있습니다

float te= 0, h = 0, ar = 0, v = 0; 
sscanf(f2, "%*s %f%*s %f%*s %f%*s %f)",&te, &h, &ar, &v); 
+0

형식 문자열을 조정할 경우 공백을 포함하도록 입력 형식을 변경할 필요가 없습니다. – Jens

0
#include <stdio.h> 

int main(void){ 
    char buff[] = "Parameters: 43 VALUES FROM 0000:0000 (043)\n" 
       "Name_8:(Temp=21.45,Hum=45.65,AR=9.34,Volt=3.46V)"; 
    char dev[25], temp[25], hum[25], ar[25], volt[25]; 
    int pos = 0, len; 
    sscanf(buff, "%*[^(](%[^)])%n", dev, &len); 
    pos += len; 
    sscanf(buff + pos, "%*[^(](Temp=%[^,],%n", temp, &len); 
    pos += len; 
    sscanf(buff + pos, "Hum=%[^,],%n", hum, &len); 
    pos += len; 
    sscanf(buff + pos, "AR=%[^,],%n", ar, &len); 
    pos += len; 
    sscanf(buff + pos, "Volt=%[^V]V%n", volt, &len); 
    printf("dev:%s\n", dev); 
    printf("temp:%s\n", temp); 
    printf("hum:%s\n", hum); 
    printf("ar:%s\n", ar); 
    printf("volt:%s\n", volt); 
    return 0; 
}