Последнее для в экзамене:
for (p = 0; *(pInput + l + q + 4) != ';' || *(pInput + l + q + 4) != 0; p++);
, что для никогда не заканчивается, потому что его условие всегда истинно
- если
*(pInput + l + q + 4)
значения ';'тест равен false || true
, затем true - , если
*(pInput + l + q + 4)
значения 0, тест равен true || false
, затем true - для всех остальных символов, тест равен
true || true
, так что снова true + 4
должно быть + 3
иначе идет на 1 символ слишком далеко - и
p++
никак не влияет на тест
Тест можно изменитьдо !(*(pInput + l + q + 3 + p) == ';' || *(pInput + l + q + 3 + p) == 0)
, чтобы остановиться, когда ';'или достигнут нулевой символ
Конечно, после *(pInput + l + q + 4) = 0;
должно быть *(pInput + l + q + 3 + p) = 0;
Обратите внимание, что pQuantity
и pPrice
выделены, но никогда не освобождаются.
Экзамен можно упростить, например:
ITEM *Exam(const char *pInput)
{
ITEM *pItem = (ITEM *)malloc(sizeof(ITEM));
const char *p;
p = strchr(pInput, ',');
pItem->pName = strndup(pInput, p - pInput);
p += 1;
pItem->Quantity = atoi(p);
p = strchr(p, ',') + 1;
pItem->Price = atoi(p);
pItem->Total = pItem->Price * pItem->Quantity;
return pItem;
}
Обратите внимание, что входная строка не изменена (я переместил ее const
), и нет динамического выделения, кроме результата и имени
если у вас нет strndup :
char * strndup(const char * s, int n)
{
char * r = (char *) malloc(n + 1);
memcpy(r, s, n);
r[n] = 0;
return r;
}