Я пишу программу на C на визуальной студии.Но моя программа не запускается и не возвращает никаких ошибок.Может кто-то взглянуть на это? - PullRequest
0 голосов
/ 01 января 2019

Я безнадежно пытался скопировать и вставить это в другой файл, но он все равно ничего не возвращает.

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "conio.h"
#pragma warning (disable: 4996)

typedef struct item
{
    char *pName;
    int Quantity, Price, Total;
} ITEM;

ITEM *Exam(char *pInput);

int main()
{
    ITEM *pItem;
    char input[81];
    printf("Type items: ");
    gets_s(input);
    char *pInput = input;
    pItem = Exam(pInput);
    printf("Name: %s\nQuantity: %d\nPrice: %d\nTotal: %d\n", pItem->pName, pItem->Quantity, pItem->Price, pItem->Total);
    free(pItem);
    return 0;
}

ITEM *Exam(char *pInput)
{
    ITEM *pItem = (ITEM *)malloc(sizeof(ITEM));
    char *pNam, *pQuantity, *pPrice;
    int total, l, q, p;
    int qu, pr;

    for (l = 0; *(pInput + l) != ','; l++);
    pNam = (char *)malloc(l + 1);
    *(pInput + l) = '\0';
    strcpy(pNam, pInput);
    pItem->pName = pNam;
    *(pInput + l) = ',';

    for (q = 0; *(pInput + l + 2 + q) != ','; q++);
    pQuantity = (char *)malloc(q + 1);
    *(pInput + l + q + 2) = 0;
    strcpy(pQuantity, pInput + l + 2);
    qu = atoi(pQuantity);
    pItem->Quantity = qu;

    for (p = 0; *(pInput + l + q + 4) != ';' || *(pInput + l + q + 4) != 0; p++);
    pPrice = (char *)malloc(p + 1);
    *(pInput + l + q + 4) = 0;
    strcpy(pPrice, pInput + l + q + 4);
    pr = atoi(pPrice);
    pItem->Price = pr;
    pItem->Total = pr * qu;
    return pItem;
}

Ввод 'рубашка, 100, 5'.Я хочу, чтобы на выходе была структура имени, количества, цены и итога.Это позволяет мне вводить ввод, но когда я нажимаю ввод, он ничего не возвращает.Программа просто зависает ...

1 Ответ

0 голосов
/ 01 января 2019

Последнее для в экзамене:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...