运行后xuhao数据变化了4368768??

敲风奏雨 2017-02-18 10:45:52
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define ZHANGHUSHU 20
#define JIAOYISHU 20


struct JY
{float jine;
float yue;
char leixing[20];
int year;
int month;
int day;
};

struct ZH
{char zhanghao[15];
char zhanghuming[5];
int jiaoyicishu;
struct JY jiaoyi[JIAOYISHU];
}zhanghu[ZHANGHUSHU];

int xuhao=0;

void xianshicaidan();
void xinjianzhanghu();
void cunqian();

void xianshicaidan()
{int a;
printf("\t\tATM主菜单\n1.新建账户\t2.存钱 \t3.取钱 \n4.查询 \t5.转账 \n");
printf("请输入序号进行操作!\n");
scanf("%d",&a);
switch(a){
case 1:xinjianzhanghu();break;//新建账户
case 2:cunqian();break;//存钱
case 3: ;
case 4: ;
case 5: ;

default:printf("输入错误,请重新输入!");}
}

void xinjianzhanghu()
{
printf("请输入账号:");
scanf("%s",zhanghu[xuhao].zhanghao);
printf("请输入账户名:");
scanf("%s",zhanghu[xuhao].zhanghuming);
printf("请输入账户余额:");
scanf("%d",&zhanghu[xuhao].jiaoyi[0].yue);
zhanghu[xuhao].jiaoyicishu=0;
zhanghu[xuhao].jiaoyi[0].jine=0;
strcpy(zhanghu[xuhao].jiaoyi[0].leixing,"新建账户");
xuhao++;
printf("这是第%d个账号\n",&xuhao);
}


void cunqian()
{int i,b;
float j;

char z[15];
char m[5];
printf("请输入账号");
scanf("%s",z);
for(i=0;i<xuhao;i++)
if(strcmp(zhanghu[i].zhanghao,z)==0){printf("请输入账户名");
scanf("%s",m);
if(strcmp(zhanghu[i].zhanghuming,m)==0){
printf("请输入存入金额");
scanf("%d",&j);
b=++zhanghu[i].jiaoyicishu;
zhanghu[i].jiaoyi[b].yue+=j;
zhanghu[i].jiaoyi[b].jine=j;
strcpy(zhanghu[i].jiaoyi[b].leixing,"存入");
printf("请输入日期(格式:年/月/日)");
scanf("%d/%d/%d",&zhanghu[i].jiaoyi[b].year,
&zhanghu[i].jiaoyi[b].month,
&zhanghu[i].jiaoyi[b].day);}
else {printf("请重新输入");return;}
}
else {printf("请重新输入");return;}
}


int main()
{
xianshicaidan();

return 0;
}
...全文
126 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-02-21
  • 打赏
  • 举报
回复
printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方,而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
自信男孩 2017-02-20
  • 打赏
  • 举报
回复
printf("这是第%d个账号\n",&xuhao);
这句输出的是变量xuehao在内存中的地址,不过地址应该使用%lu或者%x,%p输出; 正确的做法是去掉取地址符!
赵4老师 2017-02-20
  • 打赏
  • 举报
回复
学会使用数据断点。 仅供参考:
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}
qq_37585864 2017-02-20
  • 打赏
  • 举报
回复
printf("这是第%d个账号\n",&xuhao); 这句话写错了 应该是 printf("这是第%d个账号\n",xuhao); ,你多加了一个‘&’,输出的时候是不需要加址符‘&’的
小灸舞 版主 2017-02-20
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧