C语言输入数据后位数改变就无法输出正确数据

经过修改 程序有输出 但是单价和总价都是错的。
题目如下:有一个售货柜员机,内有多种商品供人购买(商品种类不超过100个),每种商品有名称、数量、价等信息。编程完成n种商品信息的输入输出。(输入时,第一行输入商品种类个数n,第二行依次输入商品的名称,数量,单价。 输出时,输出商品名称、数量、单价(保留1位小数)和总价(等于单价*数量,保留2位小数),不同数字之间有一个空格。)

#include <stdio.h>
struct shangpin
{ char ming[20];
int shul;
float danj;
float zongj;
}sp[100];
int main()
{int i,n;
printf("几种商品?");
scanf("%d",&n);
printf("请输入商品名称 数量 单价:"); 
for(i=0;i<n;i++)
{scanf("%s%d%lf",sp[i].ming,&sp[i].shul,&sp[i].danj);
sp[i].zongj=sp[i].shul*sp[i].danj;
}
for(i=0;i<n;i++)
{printf("%s %d %5.1lf %5.2lf ",sp[i].ming,sp[i].shul,sp[i].danj,sp[i].zongj);
}
}


这些int float 都要加上 取地址 &

scanf("%s%d%lf", sp[i].ming, &sp[i].shul, &sp[i].danj);