0 дауыс
454 қаралым

Маған түрдегі жолды талдайтын C/C++ тілінде токенизаторды әзірлеу керек

char pSignature[] = "work.\\top =>\\p1 =:5:p2=:10:=>interface_ports:=dut";

және p1 5 және p2 10 жұбын толтырыңыз және т.б. Кез келген адам лайықты әдісті ұсына алады ма?

strtok пайдалану мәселесі =>интерфейс порттары пайда болғанға дейін оны қалай тоқтату керектігін анықтау болып табылады. Мен жазған код келесідей:

1 жауап

0 дауыс

strtok орнына жолды көрсеткішпен біртіндеп оқу ыңғайлы. Алдымен "=>interface_ports" басталатын орынды тауып, сол жерге дейінгі бөліктен ғана pN=:мән жұптарын іздеңіз.

Мысалы:

const char *s = pSignature;
const char *end = strstr(s, "=>interface_ports");
if (end == NULL) end = s + strlen(s);

while (s < end) {
int index, value;
if (sscanf(s, "\\p%d =:%d", &index, &value) == 2 ||
sscanf(s, "\\p%d=:%d", &index, &value) == 2) {
printf("p%d = %d\n", index, value);
}

const char *next = strchr(s, ':');
if (next == NULL || next >= end) break;
s = next + 1;
}

Бұл тәсілде interface_ports бөлігіне жеткен соң талдау тоқтайды. Нақты деректерді массивке сақтау керек болса, index мәнін шекарадан тексеріп, мысалы values[index] = value; деп жазыңыз.

Егер бос орындар әртүрлі орналасуы мүмкін болса, sscanf пішіміндегі бос орындар оларды автоматты түрде өткізіп жібереді. Ал кіріс форматы күрделенсе, sscanf орнына әрбір таңбаны тексеретін шағын күйлік талдаушы сенімдірек болады.

128,000
сұрақ
323,322
жауап
153,172
пікір
73,094
қолданушы
...