打印结构显示垃圾

时间:2013-09-26 20:31:02

标签: c

我正在尝试做一个简单的练习,我应该在一个结构中使用指针和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 个答案:

答案 0 :(得分:0)

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

您最简单的解决方法是将您的j循环更改为j&lt;我而不是j&lt; = i。这样它就不会反对自己,无论如何都是愚蠢的。

答案 1 :(得分:0)

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

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

  2. 你总是将monto加倍应该是

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

  4. 这是因为当i = 0时,你的j(是&lt; = 0)将比较pTrans [0] .loc == pTrans [0] .loc。 因为这总是正确的,你现在将你的pTrans [0] .monto(不是你所期望的)加倍,从而给出错误的结果。

    现在我试图重新使用它 - 使i == - 1。

    现在打印这个未初始化的,意外的[-1]元素,为您提供在该内存位置发生的任何事情。 现在你被第三个效果击中 - 你增加我使它为0,然后再次使用0元素迭代。 所有这都是一个小错误的结果:在j循环中使用条件j&lt; = i。 如果将其更改为

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

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

答案 2 :(得分: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){

其他答案中的内容也是如此。

答案 3 :(得分:0)

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