c - 我正在 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'。我希望输出是名称、数量、价格和总计的结构。它让我输入输入,但是当我按下输入时它不会返回任何内容。该程序只是挂起...
解决方案
考试的最后一个是:
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
必须是+ 3
else 走得太远了 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
andpPrice
被分配但从未被释放。
考试可以简化,例如:
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;
}
推荐阅读
- javascript - 为什么控制台会在我已经定义变量时记录我的变量未定义的错误?
- android - 即使在应用程序被杀死android之后,如何继续在前台启动的上传过程?
- reactjs - create-react-library 不适用于样式化组件
- c# - C# 是否支持自动返回 var 类型?
- c++ - 如何对 vtk Poly Data 进行布尔运算?
- highcharts - highcharts / node-export-server:包含大型数据集的空白图表
- ios - ios swift以编程方式根据所有iOS设备和方向显示图像?
- mysql - 为什么 EXPLAIN 根据 MySQL 中的用户返回不同的 Extra(文件排序)?
- javascript - sheetJS:当您想将毫秒转换为 h:mm 时,单元格对象应该如何显示?
- javascript - js应用程序中的cors策略阻止了FirebaseAuth请求