我正在尝试使用 sscanf 解析以下字符串:

query=testword&diskimg=simple.img

如何使用 sscanf 解析出“testword”和“simple.img”? sscanf 的分隔符参数真的让我感到困惑:/

谢谢!

最佳答案

如果你知道 "testword"的长度总是 8 个字符,你可以这样做:

char str[] = "query=testword&diskimg=simple.img";
char buf1[100];
char buf2[100];

sscanf(str, "query=%8s&diskimg=%s", buf1, buf2);

buf1 现在将包含“testword”,而 buf2 将包含“simple.img”。

另外,如果您知道测试词将始终以=开头和&后面,并且simple.img始终以=开头,则可以使用以下命令:
sscanf(str, "%*[^=]%*c%[^&]%*[^=]%*c%s", buf1, buf2);

这很神秘,所以这里是摘要:每个%代表一小段文本的开头。如果%后面有*,则表示我们忽略该块,并且不将其存储在我们的缓冲区之一中。括号内的 ^ 表示该块包含任意数量的不是括号内字符的字符(除了 ^ 本身)。 %s读取任意长度的字符串,而%c读取单个字符。

总结一下:
  • 如果字符不是=,我们会继续阅读并忽略它们。
  • 我们读取并忽略另一个字符(等号)。
  • 现在我们处于testword位置,因此我们继续读取字符并将其存储到buf1中,直到遇到&字符为止。
  • 要阅读和忽略的更多字符;我们继续前进,直到再次击中=。
  • 我们读取并忽略单个字符(再次是等号)。
  • 最后,我们将剩下的(“simple.img”)存储到 buf2 中。
  • 10-04 20:24