首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解析wpa_cli SCAN_RESULTS输出的代码

解析wpa_cli SCAN_RESULTS输出的代码
EN

Stack Overflow用户
提问于 2013-10-15 20:44:55
回答 1查看 4K关注 0票数 1

我正在编写一个C代码,它通过SCAN_RESULTS执行扫描和wpa_cli命令,并获得wifi扫描结果。在某些情况下,在解析SCAN_RESULTS输出以捕获密钥管理和SSID字段时遇到了问题

用于读取所有参数的代码是

代码语言:javascript
运行
复制
sscanf(buf, "%s \t %s \t %s \t %s \t %[^\n]s", bssid, freq, siglevel, keymgmt, ssid);

wpa_cli SCAN_RESULTS命令的输出将是

代码语言:javascript
运行
复制
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命令的输出

代码语言:javascript
运行
复制
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代码以使其工作的指针

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-15 21:10:20

sscanf()格式不像预期的那样工作。

IMHO没有一个sscanf()的格式可以用""填充目标字符串(或者跳过它),然后用文本填充后续的目标字符串。一旦scanf()在目标字符串中找不到任何东西,扫描就停止。

给出了备选代码。

代码语言:javascript
运行
复制
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()的结果都应该被评估为

代码语言:javascript
运行
复制
if (3 != sscanf(buf, "%s\t%s\t%[^\n]s", a, b, c)) handle_error();

如果如OP所建议的那样,字段确实是\t分隔的,请使用

代码语言:javascript
运行
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19390701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档