我正在编写一个C代码,它通过SCAN_RESULTS执行扫描和wpa_cli命令,并获得wifi扫描结果。在某些情况下,在解析SCAN_RESULTS输出以捕获密钥管理和SSID字段时遇到了问题
用于读取所有参数的代码是
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变量为空,ssid保存"OPENSSID“。当我试图将上面的输出捕获到文件并尝试十六进制时,我可以在“信号级别”和"ssid“之间看到两个连续的选项卡(\t\t)。任何关于如何更改sscanf代码以使其工作的指针
发布于 2013-10-15 21:10:20
sscanf()
格式不像预期的那样工作。
IMHO没有一个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()
的结果都应该被评估为
if (3 != sscanf(buf, "%s\t%s\t%[^\n]s", a, b, c)) handle_error();
如果如OP所建议的那样,字段确实是\t
分隔的,请使用
if (3 != sscanf(buf, "%[^\t]%*1[\t]%[^\t]%*1[\t]%[^\n]", a, d, c)) handle_error();
"%[^\t]"
扫描直到找到一个选项卡。
"%*1[\t]"
扫描1选项卡,不保存也不添加到sscanf()结果。
"%[^\n]"
扫描直到找到行尾为止.
注意:
3而不是OP的5个参数用于简单。
在sscanf()
中," \t "
与" "
做同样的事情。
在"%[^\n]s
中,当然不需要s
。
https://stackoverflow.com/questions/19390701
复制相似问题