如何使用 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;
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;