用于解析的Sscanf分隔符?

Jas*_*ock 7 c parsing scanf

我试图用sscanf解析以下字符串:

query=testword&diskimg=simple.img
Run Code Online (Sandbox Code Playgroud)

如何使用sscanf解析出"testword"和"simple.img"?sscanf的分隔符参数让我很困惑:/

谢谢!

dst*_*st2 15

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

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

sscanf(str, "query=%8s&diskimg=%s", buf1, buf2);
Run Code Online (Sandbox Code Playgroud)

buf1现在将包含"testword",buf2将包含"simple.img".

或者,如果您知道testword将始终以=开头,后跟&,并且simple.img将始终以=开头,您可以使用:

sscanf(str, "%*[^=]%*c%[^&]%*[^=]%*c%s", buf1, buf2);
Run Code Online (Sandbox Code Playgroud)

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

总结一下:

  • 如果不是=,我们会继续阅读和忽略字符.
  • 我们阅读并忽略另一个角色(等号).
  • 现在我们处于testword,所以我们继续阅读并将字符存储到buf1中,直到我们遇到&字符.
  • 要读取和忽略的字符越多; 我们继续前进,直到我们再次击中=.
  • 我们读取并忽略单个字符(同样,等号).
  • 最后,我们将剩下的内容("simple.img")存储到buf2中.