0

我正在尝试做一个简单的练习,我应该在哪里使用指针和 malloc 在结构中输入 2 个输入(monto 和 loc)。当我尝试打印数据时,它显示垃圾。我试图检查发生了什么,所以我在输入后打印数据并显示诸如 -1414812757 -158839287345460020000000000000000000000.00 之类的内容

struct transaccion{
    int loc;
    float monto;
    char nombre[50];
} cliente,*pcliente;

int cargadatos (struct transaccion*);
void mostrarlocalidad(struct transaccion*,int);
void mostrarestructura(struct transaccion*);

void main()
{
    int tam=50,ll;
    struct transaccion *pTrans;
    pTrans=(struct transaccion*)malloc(sizeof(struct transaccion)*tam);
    pTrans[0].monto=5;
    if(pTrans==NULL){
        puts("Falta memoria");
        exit(3);
    }

    ll=cargadatos(pTrans);
    mostrarlocalidad(pTrans,ll);
    free(pTrans);
    system("pause");
}

int cargadatos (struct transaccion *pTrans)
{
    int i=0;
    while (pTrans[i].loc!=0){
        puts ("ingrese numero de localidad");
        scanf("%d", &pTrans[i].loc); fflush (stdin);
        puts ("ingrese monto");
        scanf("%.2f",&pTrans[i].monto); fflush(stdin);
        int j=0;
        for (j=0; j<=i; j++)  {
            if (pTrans[j].loc==pTrans[i].loc){
                pTrans[j].monto=pTrans[j].monto+pTrans[i].monto;
                i--;
            }
        }
        printf("%d %.2f \n",pTrans[i].loc,pTrans[i].monto);
        i++;
    }
    return;
}

几个小时以来我一直在尝试很多事情,但我无法弄清楚错误在哪里。

4

4 回答 4

0

你看到垃圾的原因是你的 j 循环是错误的。由于您正在迭代 <= i,因此您的检查将始终为真。在第一个条目中,您正在检查 pTrans[j].loc==pTrans[i].loc,其中 i 和 j 均为 0。因此,您将 j 的值设置为自身,并减少 i。当您的 printf 运行时,您正在打印 pTrans[-1] 而不是 pTrans[0] ,因为您可能认为您正在这样做。

您最简单的解决方法是将您的 j 循环更改为 j < i 而不是 j <= i。这样它就永远不会与自己发生冲突,这看起来很傻。

于 2013-09-26T20:50:51.110 回答
0

这里有三个问题是由同一个错误引起的 - j 循环上的错误条件。我假设您正在尝试做的是读入一个数组元素,并扫描所有先前的数组元素,看看您是否已经在该位置有一些东西 - 在这种情况下,您想使用“旧”元素进行计数,然后重用新元素。现在 j 循环上的范围错误会导致 3 个问题:

  1. 您将始终读入元素 0。

  2. 您将永远拥有应有的两倍

  3. 您将始终打印未初始化且不是您想要的数组元素 [-1]。

发生这种情况是因为当 i=0 时,您的 j(即 <=0)将比较 pTrans[0].loc==pTrans[0].loc。由于这始终是正确的,因此您现在将 pTrans[0].monto 加倍(不是您所期望的),一开始就会给出错误的结果。

现在 i 在尝试重用时递减 - 使 i==-1。

您现在打印这个未初始化的意外 [-1] 元素,为您提供该内存位置中发生的任何内容。现在你受到第三种效果的影响——你增加 i 使其为 0,并再次使用 0 元素迭代 while。所有这些都是一个小错误的结果:在 j 循环中使用条件 j<=i。如果您将其更改为

for (j = 0 ; j < i ; j++)

您的程序可能会正常工作。

于 2013-09-27T07:16:34.377 回答
0
struct transaccion{
    int loc;
    float monto;
    char nombre[50];
} cliente,*pcliente;

你声明了两个你不在任何地方使用的变量。

pTrans=(struct transaccion*)malloc(sizeof(struct transaccion)*tam);

不需要从 malloc 进行强制转换。

在使用指针之前应放置以下块。

if(pTrans==NULL){
    puts("Falta memoria");
    exit(3);
}

这个循环可能会也可能不会被执行,这取决于你会在指定的内存区域中找到的随机值。

while (pTrans[i].loc!=0){

其他答案中所说的也是正确的。

于 2013-09-27T07:32:10.720 回答
0

非常感谢大家,现在我意识到我犯了很多错误。我也知道有些变量我没有使用它,因为我还没有实现。我会更正它并发布工作代码。

于 2013-09-27T14:26:51.883 回答