Я пытаюсь разобрать кадры, отформатированные по следующей схеме:
$[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
, если ввод потенциально отличается от того, что вы ожидаете, а проанализируйте строку самостоятельно. - person Jabberwocky   schedule 14.06.2018scanf
и семьи. Возможно, вы захотите рассмотреть возможность использования других методов, таких как токенизация с помощьюstrtok
или возможно, даже регулярные выражения. - person Some programmer dude   schedule 14.06.2018string
состоит только из букв? - person chux - Reinstate Monica   schedule 14.06.2018string
превысит 99? - person chux - Reinstate Monica   schedule 14.06.2018string
? любой символ ASCII включает'\0'
, так что это, безусловно, слишком широко. С<string>;
это любой символ, кроме;
. Являются ли пробелы частьюstr1
иstr3
? - person chux - Reinstate Monica   schedule 14.06.2018