【发布时间】:2018-11-24 04:25:57
【问题描述】:
我正在尝试解析格式为以下方案的帧:
$[number],[number],[number],<string>;[string]~<string>
用'[]'包围的参数是可选的,用''包围的参数总是存在定义的:
因此,以下帧都是正确的:
$0,0,0,thisIsFirstString;secondString~thirdOne
$0,,0,firstString;~thirdOne
$,,,firstString;~thirdString
目前,当所有元素都存在时,我可以使用以下代码解析框架
int main() {
char frame[100] = "$1,2,3,string1;string2~string3";
char num1[10], num2[10], num3[10], str1[100], str2[100], str3[100];
printf("frame : %s\n", frame);
sscanf(frame,"$%[^,],%[^,],%[^,],%[^;];%[^~]~%s", num1, num2, num3, str1, str2, str3);
printf("Number 1 : %s\n", num1);
printf("Number 2 : %s\n", num2);
printf("Number 3 : %s\n", num3);
printf("String 1 : %s\n", str1);
printf("String 2 : %s\n", str2);
printf("String 3 : %s\n", str3);
return 0;
}
结果如下
frame : $1,2,3,string1;string2~string3
Number 1 : 1
Number 2 : 2
Number 3 : 3
String 1 : string1
String 2 : string2
String 3 : string3
但是,如果缺少参数,则前面的参数会被很好地解析,而丢失参数之后的参数则不会。
frame : $1,,3,string1;string2~string3
Number 1 : 1
Number 2 :
Number 3 :
String 1 :��/�
String 2 : �\<��
String 3 : $[<��
frame : $1,2,3,string1;~string3
Number 1 : 1
Number 2 : 2
Number 3 : 3
String 1 : string1
String 2 : h�v��
String 3 : ��v��
如何向sscanf 指定帧中可能缺少某些参数,以便在这种情况下将它们丢弃?
【问题讨论】:
-
我的提示:如果输入可能与您期望的不同,请不要使用
sscanf,而是自己解析字符串。 -
这样的解析真的不是
scanf和家人的强项之一。您可能需要考虑使用其他方法,例如使用strtok甚至regular expressions 进行标记。 -
如果没有提供可选数字,是否有默认值?
-
string只用字母组成吗? -
@J...S 否,可选数字(字符串相同)要么指定要么不存在(空字段)。
标签: c parsing scanf optional-parameters format-specifiers