如何使用 sscanf 检索包含 space 的字符串

How to use sscanf to retrieve a string containing space

char s[]="question:Does it have eyes?"

我想检索由“:”分隔的两个字符串。

char question[10];
char content[100];
sscanf(s,"%[a-z]%[a-z]",question,content);

由于 sscanf() 通过 space 检索字符串,我无法得到完整的问题。我怎样才能用 sscanf() 完全检索整个问题?谢谢

您是否考虑过使用倒置扫描集?比如这里有两个:

char question[10];
char content[100];
sscanf(s,"%[^:]:%[^\n]",question,content);

你现有的代码已经差不多是你想要的了。特别注意

sscanf() retrieves strings by space

不完全正确。 sscanf() 将白色space(不仅包括 space 字符)解释为 用于 %s 字段描述符 的字段分隔符 ,但是您也可以通过 %[] 字段描述符扫描字符串,就像您已经在做的那样,它会扫描您告诉它要扫描的任何字符。

此外,您需要告诉 scanf() 期待冒号,即使它不会被扫描到您的任何一个字符串中。因此,您可以这样解决问题:

sscanf(s, "%9[^:]:%99[^[=10=]1]", question, content);

第一个字段描述符将最多 9 个字符加上一个字符串终止符扫描到 question 中,接受 : 以外的任何字符。然后它扫描并忽略 :,并扫描最多 99 个不同于 '[=20=]1' 的字符到 content'[=20=]1' 是我认为在输入中不期望的字符之间的任意选择。

另一方面,如果您希望扫描的字符串始终以文字字符 "question:" 开头,那么您最好使用

sscanf(s, "question:%99[^[=11=]1]", content);

请记住 sscanf() 的 return 值告诉您有多少个输入字段被成功扫描,这可以通知您有关解析错误(例如数据不是以 "question:").

另一方面,如果您希望扫描的字符串始终以文字字符 "question:" 开头,并且只想捕获后面的所有内容,那么 sscanf() 有点一个重量级的工具。我会这样做,而不是:

if (!strncmp(s, "question:", 9)) {
    strncpy(content, s + 9, sizeof(content) - 1);
    content[sizeof(content) - 1] = '[=12=]';  /* in case the content was too long */
} else {
    /* handle malformed string */
}

反转扫描集和"%n"
使用 char *content; 而不是 char content[100];

char s[]="question:Does it have eyes?"
char question[10];
char *content;

int n = 0;
sscanf(s, "%9[^:]:%n",question, &n);
if (n == 0) Handle_Failure();
content = s+n;