首页 > 解决方案 > 我正在 Visual Studio 上编写 C 程序。但是我的程序没有运行,也没有返回任何错误。有人可以看看吗?

问题描述

我绝望地试图将其复制粘贴到另一个文件中,但它仍然没有返回任何内容。

#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'。我希望输出是名称、数量、价格和总计的结构。它让我输入输入,但是当我按下输入时它不会返回任何内容。该程序只是挂起...

标签: cvisual-studio

解决方案


考试的最后一个是:

for (p = 0; *(pInput + l + q + 4) != ';' || *(pInput + l + q + 4) != 0; p++);

那永远不会结束因为它的条件总是真实的

  • 如果*(pInput + l + q + 4)值';' 然后测试为false || true
  • 如果*(pInput + l + q + 4)值为 0,则测试为true || false
  • 对于所有其他角色,测试true || true再次如此真实
  • + 4必须是+ 3else 走得太远了 1 个字符
  • 并且p++对测试完全没有影响

测试可以更改为!(*(pInput + l + q + 3 + p) == ';' || *(pInput + l + q + 3 + p) == 0)在';'时停止 或达到空字符

当然*(pInput + l + q + 4) = 0;必须是之后*(pInput + l + q + 3 + p) = 0;

请注意,pQuantityandpPrice被分配但从未被释放。


考试可以简化,例如:

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;
}

推荐阅读