2013-10-15 3 views
1

wpa_cli를 통해 SCAN 및 SCAN_RESULTS 명령을 실행하고 wifi 스캔 결과를 얻는 C 코드를 작성하고 있습니다. 나는 특정 시나리오wpa_cli 구문 분석 코드 SCAN_RESULTS 출력

에서 키 관리 및 SSID 필드를 캡처 할 SCAN_RESULTS 출력을 구문 분석에 문제가

내가 모든 매개 변수를 읽기 위해 사용하는 코드는

sscanf(buf, "%s \t %s \t %s \t %s \t %[^\n]s", bssid, freq, siglevel, keymgmt, ssid); 

입니다 wpa_cli SCAN_RESULTS 명령의 출력이 될 것입니다

bssid/frequency/signal level/flags/ssid 
00:00:00:00:00:00 2462 -49 [WPA2-PSK-CCMP][ESS] MYSSID 
11:11:11:11:11:11 2437 -64 [WPA2-PSK-CCMP][ESS] ANOTHERSSID 

필드가 탭 (\ t)으로 구분되어있는 경우 위 출력을 사용하면 코드가 올바르게 작동합니다. 내 검사 결과는 다음 내 코드 나누기를 일부 오픈 네트워크를 가지고 때 나는 나의 요구 사항을 wpa_cli SCAN_RESULTS의 출력은 위의와 오픈 네트워크

bssid/frequency/signal level/flags/ssid 
00:00:00:00:00:00 2462 -49 [WPA2-PSK-CCMP][ESS] MYSSID 
22:22:22:22:22:22 2437 -72 OPENSSID 

와 명령

에 맞게 코드를 변경하는 방법을 몰라 내 코드를 출력하면 "OPENSSID"를 포함하는 keymgmt 변수가보고되고 ssid 변수는 비어 있습니다. 그러나 keymgmt 변수를 "OPENSSID"를 저장하기 위해 빈 변수와 ssid 변수로 사용하고 싶습니다. 위의 출력을 파일로 캡쳐하고 hexdump를 시도했을 때 "신호 레벨"과 "ssid"사이에 두 개의 연속 탭 (\ t \ t)이 있습니다. 작동하도록 sscanf 코드를 변경하는 방법에 대한 모든 포인터는 예상대로 작동하지 않습니다.

+0

저는 그것이 정규식이 아니라고 확신합니다. Regexes는 매우 특정한 유형의 텍스트 처리 도구입니다. – user1618143

답변

0

sscanf() 형식이 예상대로 작동하지 않습니다.

는 이럴 ""와 대상 문자열을 입력 (또는 그것을 생략) 다음 텍스트와 후속 대상 문자열을 입력하는 형식없는 단일 sscanf()있다. scanf()이 대상 문자열에 아무 것도 입력하지 않으면 검색이 중지됩니다.

대체 코드가 표시됩니다.

int ScanTabbedData(const char *s, char *data[], size_t n) { 
    size_t i = 0; 
    const char *Start = s; 
    while (1) { 
    if ((*s == '\t') || (*s == '\0')) { 
     if (i >= n) { 
     return -1; // More than n data 
     } 
     size_t Length = s - Start; 
     memcpy(data[i], Start, Length); 
     data[i][Length] = '\0'; 
     i++; 
     if (*s == '\0') { 
     return i; 
     } 
     s++; 
     Start = s; 
    } 
    else s++; 
    } 
    return 0; 
} 

int main() { 
    char *str1= "Test\tHope\tHello"; 
    char *str2 = "Test\t\tHello"; 
    char *t[3]; 
    t[0] = malloc(100); t[1] = malloc(100); t[2] = malloc(100); 
    int n; 
    n = ScanTabbedData(str1, t, 3); 
    printf("%d:%s:%s:%s\n", n,t[0], t[1], t[2]); 
    n = ScanTabbedData(str2, t, 3); 
    printf("%d:%s:%s:%s\n", n,t[0], t[1], t[2]); 
} 

두 번째 대안으로는 strtok()을 사용하십시오. 나는 OP가 비록 원할지도 모르기 때문에 그것이/연속적인 \t를지도 처리한다고 확신하지 않는다.

다음은 OP의 필요를 충족시키지 않는 원래의 대답입니다.


** 원래 대답 **

첫째, 어떤 sscanf()의 결과가 영업 이익은 제안으로, 필드 분리 진정 \t은,

에서
if (3 != sscanf(buf, "%s\t%s\t%[^\n]s", a, b, c)) handle_error(); 

것처럼 평가해야한다, 탭까지

if (3 != sscanf(buf, "%[^\t]%*1[\t]%[^\t]%*1[\t]%[^\n]", a, d, c)) handle_error(); 

"%[^\t]" 스캔을 사용하여 전 찾았습니다.
"%*1[\t]" 스캔 1 탭은 sscanf() 결과를 저장하거나 추가하지 마십시오.
"%[^\n]" 줄 끝이 발견 될 때까지 검색합니다.

참고 : 단순화를 위해 OP의 5 개 매개 변수가 아닌
3 개입니다.
sscanf()에서 " \t "" "과 동일한 것을 수행합니다.
"%[^\n]s에는 확실히 s이 필요하지 않습니다.

+0

죄송합니다. 제게 적합하지 않습니다. 방금 다음 코드를 시도했습니다. 'char str [] = "Test Hope Hello"; %, % t1, t2, t3); t2, t3, t2, t3, t2, t3); 내가 값을 인쇄하려고하면 ** STR ** 탭으로 구분되고, 내가 RET = 1 T1은 = 테스트 및 T2와 T3 모두 – BalaC

+0

@BabaC 당신이 사용하는 것을 의미 했습니까 비어 있습니다 볼 수 있습니다 여기에 문자열 "Test \ tHope \ tHello"또는 "_ _"이 탭 문자 인 "Test_Hope_Hello"를 코딩 했습니까? – chux

+0

@BabaC 당신의 의견은 당신이 % [^ \ t] % * 1 [\ t] % [^ \ t] ... "'시도했다고 말합니다. 게시 된 형식 '% [^ \ t] % * 1 [\ t] % [...]'을 (를) 사용해 보셨습니까? – chux