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

时间:2015-11-24 14:14:55

标签: c scanf

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

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

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

当sscanf()按空格检索字符串时,我无法得到完整的问题。我怎么能用sscanf()完全检索整个问题?感谢。

3 个答案:

答案 0 :(得分:1)

您现有的代码几乎已经是您想要的了。特别注意

  

sscanf()按空格检索字符串

不完全正确。 sscanf()将空格(包括不仅仅是空格字符)解释为%s字段描述符的字段分隔符,但您也可以通过{{1}扫描字符串你正在做的字段描述符,它会扫描你告诉它扫描的任何字符。

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

scanf()

第一个字段描述符最多可扫描9个字符,并将字符串终止符扫描到sscanf(s, "%9[^:]:%99[^\001]", question, content); ,接受question以外的任何字符。然后它会扫描并忽略:,并扫描最多99个不同于:的字符到'\001'content是我认为在输入中不期望的字符中的任意选择。

另一方面,如果您希望扫描的字符串始终以文字字符'\001'开头,那么您可能会感觉更好

"question:"

请记住,sscanf(s, "question:%99[^\001]", content); 的返回值会告诉您已成功扫描了多少输入字段,这可以告知您解析错误(例如不以sscanf()开头的数据)。

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

sscanf()

答案 1 :(得分:1)

倒置扫描设置和"%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;

答案 2 :(得分:0)

您是否考虑使用倒置扫描设备?例如,这里有两个:

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