#c #parsing #c-strings
#c #синтаксический анализ #c-строки
Вопрос:
Нужны несколько советов о том, что, по вашему мнению, было бы лучшим способом анализа определенного ввода в C.
Входные данные имеют формат xx xx xx xx xx xx xx y1 y2 y3 y4
, в котором xx
и yy
могут быть любыми двумя символами от a до z, но они имеют разные значения.
xx
Необходимость относиться к ним как к «отдельным лицам» и выполнять некоторые проверки. y0
Необходимость рассматривать как комбинации и иметь другой набор проверок и операций. (например, необходимо проверить y1 и y2 вместе, а затем использовать их для выполнения действия).
Я использовал функцию strtoken
для перебора xx
символов, поскольку ее разделителем является пробел. Однако для второй части мне нужно изменить это поведение, поскольку код должен знать о 3 последовательных пробелах, которые сообщают, что мы сейчас находимся во второй части, и ему нужно начать проверку комбинаций y.
Все советы приветствуются 🙂 Спасибо
Комментарии:
1. Вы можете найти, где находится разрыв, с
char *ptr = strstr(input, " ");
помощью If found , написать''
в этой точке строковый терминатор и работать с двумя строкамиinput
иptr 3
.2. Я предполагаю, что не существует постоянного числа
xx
s илиyn
s? Как в, их переменное количество? Есть ли хотя бы верхняя граница?3. Привет @Chase, там действительно постоянное количество,
xx
но неy's
Ответ №1:
Согласно вопросу OPs, нет никаких ограничений на значение, содержащееся в xx
.
Т.е. xx
может содержать любое значение от 0x00, 0x00 до 0xFF, 0xFF
Можно switch()
использовать оператор, но без ограничений на значения потребуется 256 * 256 случаев.
Аналогичные соображения применимы и к y0
y1
y2
вычислениям.
Учитывая вышесказанное, код будет начинаться с:
#include <stdio.h>
#include <string.h>
// '7' gotten from the OPs example
#define NUM_XX 7
int main( void )
{
char xx[2];
char dummy;
for( size_t x = 0; x < NUM_XX; x )
{
xx[0] = getchar();
xx[1] = getchar();
dummy = getchar();
// calculate index
int index_xx = xx[0]*256 xx[1];
switch( index_xx )
// index_xx could be most any value from 0 to 256*256
{
case 0:
....
break;
....
case 256*256:
....
break;
}
// consume the intervening spaces
getchar();
getchar();
getchar();
char y0[2];
char y1[2];
char y2[2];
the `y#`s would be read/processed in a similar loop, exiting the loop on EOF