论坛: 编程破解 标题: 一个c程序,为什么不能正常运行?????(286能进来看看吗?) 复制本贴地址    
作者: lwei889 [lwei889]    论坛用户   登录
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct ATM link;
struct ATM
{char name[10];          /*ueser name*/
char password[6];        /*ueser passwork*/
char ID[16];            /*ueser ID card*/
int year,month,day;
long  money;
unsigned long account;
};
static int flag=0;
  struct ATM *account(void)
  { link *p[10];
    int i;
    randomize();
    for(i=flag;i<=flag;i++)
      {printf("\nplease input you name:");
gets(p[i]->name);
      printf("\nplease input your password:");
getchar();
gets(p[i]->password);
      printf("\nplease input ID:");
getchar();
gets(p[i]->ID);
      printf("please input year,month,and day:");
scanf("%d,%d,%d",&p[i]->year,&p[i]->month,&p[i]->day);
getchar();
      printf("\n please input your money:");
scanf("%ld",&p[i]->money);
      printf("\nok,success!please rember you account is:");
p[i]->account=random(1000000000000)+10000000000000000;
      printf("%ld",p[i]->account);
      printf("\nDo you continue ?(y/n)");
        {char ch;
          ch=getch();
          if(ch=='y'||'Y')
                flag++;
            }
      }
  }
main()
{
clrscr();
account();
getch();
}
这个程序我在tc2.0下调试,但不能正常运行,但不知道为什么???
错误的地方在 从下面开始,就会出现异常,
 
      printf("\n please input your money:");
scanf("%ld",&p[i]->money);
      printf("\nok,success!please rember you account is:");
p[i]->account=random(1000000000000)+10000000000000000;
      printf("%ld",p[i]->account);

希望哪位找出毛病后,给我回个贴子,谢谢拉



[此贴被 子木(lwei889) 在 11月10日13时59分 编辑过]


[此贴被 子木(lwei889) 在 11月10日13时20分 编辑过]

地主 发表时间: 11/09 18:38

回复: Garu [syshunter]   版主   登录
没有异常啊



B1层 发表时间: 11/09 19:57

回复: ceo_8008 [ceo_8008]   论坛用户   登录
我用了数据跟踪,好象不能正确赋值

再看看吧,是有点奇怪

简单是挺简单的,怎么会这样呢?

不过可以先把那个没用的循环去掉吧

还有那个getchar()的都没用

因为在这里循环只有一次,我知道你本意是想多次输入才设置的flag



[此贴被 寒枫(ceo_8008) 在 11月09日20时52分 编辑过]

B2层 发表时间: 11/09 20:10

回复: lwei889 [lwei889]   论坛用户   登录
我在程序里有做了些修改,这个程序出现异常的地方,不能连续多次输入,有时连一次完整的输入都不能完成,但是,当我把定义的结构体改成普通变量时,就没有问题了,我不知道这是为什么???是定义的结构体出了问题????
帮我找找原因何在啊!!!!!!!

B3层 发表时间: 11/10 13:32

回复: Garu [syshunter]   版主   登录
晕```当然了。要不还搞个malloc出来干什么,指针可没你想的那么智能化。

B4层 发表时间: 11/10 13:53

回复: lwei889 [lwei889]   论坛用户   登录
那就是说是动态内存开辟的问题拉
  Garu :我还想再问一下,是不是在定义的结构体数组,输入数据时要动态开辟内存,就相当于创建一个链表???,不这样不行吗?
(结构体和链表的创建这部分是我自学的,我还不太懂怎么用?希望你能多多指教,谢谢)

B5层 发表时间: 11/10 15:52

回复: gdyxiao [gdyxiao]   论坛用户   登录
我想应该是吧

B6层 发表时间: 11/10 16:27

回复: 286 [unique]   版主   登录
我没完全看完你的程序,主要发现以下几个问题:
1 ATM中有个account成员变量,又有一个全局函数account。二者重名,将来可能带来一些隐含的错误,建议换其中一个。
2 没看出flag的作用,好象不是控制循环用,而是为了控制是否继续。如果这样,可采用如下方法:
int flag=true;
while (flag)
{
  ......
  if (ch=='n'|| ch=='N')
          flag=false;
}
3 ch=='y'||'Y'是初学者常犯的错误,他等价于ch=='y'|| 'Y'==true
应该改为:ch=='y'|| ch=='Y'
4 也是该程序中最重要的错误。
ATM作为一个结构是声明过了,但没有实例化。也就是说在内存中并没有这样一个结构(虽然你有link *p[10],这只是实例化了十个指向这样结构的指针),因此你应该把*号去掉,去掉后,后面的->都变成了.如果你还想用->,你需要再声明一个指针。
5 year,month,day出错的原因是因为这里要输入三个值,并且三个值间要用逗号隔开。否则------>  :(

你再改改吧,改完再说。



B7层 发表时间: 11/10 16:58

回复: lwei889 [lwei889]   论坛用户   登录
谢谢286的建议,我改后再来发消息!

B8层 发表时间: 11/10 18:46

回复: lion [lion]   论坛用户   登录
你能否说下具体的出错提示

B9层 发表时间: 11/10 20:02

回复: ceo_8008 [ceo_8008]   论坛用户   登录
286,我觉得他设置flag本意应该是想多次输入,

但因为程序只运行一次就失败,所以他在发到论坛上来时候把flag改为0

:)

B10层 发表时间: 11/10 20:12

回复: lwei889 [lwei889]   论坛用户   登录
286:
我的本意是每次只循环一次,但当用户还要继续时,flag做一次自加,这样可以输入一组数据。
  现在我按你说的改后,可以执行了,原因是*p[10],换成p[10],可以正常运行,但我还不是太明白为什么*p[10]就不行,我还不太清楚怎么能让内存知道有这么一个结构???
我一直在学习c语言,也热爱c语言,但在结构体和链表这个地方却过不关!望能给点指点

谢谢拉,也谢谢大家给我这个问题的回答!



B11层 发表时间: 11/10 20:26

回复: NetDemon [netdemon]   ADMIN   登录
这程序是一定溢出的!

那来做练习无所谓,但还是建议不要培养这样的风格出来,安全问题要从小抓。搞安全的一看这程序一定乐了,又一个漏洞出来了。

看一下这个或许你就明白为什么会溢出,然后大概你也会知道为什么会有异常。

char name[10];
char buf[MAXBUF];

memset(name,NULL,sizeof(name));
printf("Please input you username:");
fgets(buf,1024,stdin);
strncpy(name,buf,9);
printf("Please input you password:");
......

事实上,如果你的程序含有gets(), gcc的话他是拒绝编译的


[此贴被 NetDemon(netdemon) 在 11月10日20时36分 编辑过]

B12层 发表时间: 11/10 20:43

回复: Garu [syshunter]   版主   登录
老大,你和他说这些还早了
问题是他现在还不了解
link *p[10]和link *p=(link)malloc(sizeof(link)*10)的区别。

to楼主:先不慌接触链表,先把指针的概念搞清楚。

[此贴被 Garu(syshunter) 在 11月10日21时40分 编辑过]

B13层 发表时间: 11/10 21:09

回复: lwei889 [lwei889]   论坛用户   登录
谢谢站长和各位斑竹,你们的指点使我明白好多东西,我以后会努力学习的!


B14层 发表时间: 11/11 16:42

回复: 286 [unique]   版主   登录
http://www.china-askpro.com/msg45/qa72.shtml


B15层 发表时间: 11/12 11:49

回复: realpope [realpope]   论坛用户   登录
我看不懂啊

B16层 发表时间: 11/12 12:43

回复: ziaichen [ziaichen]   论坛用户   登录
我们老师以前讲过他在给人家公司编一个汽车加油站费用管理的程序时出了和你一个差不多的错误,他说一般像这样的错误就是你在程序中没有给指针分配空间,另外没有释放指针所占用的空间,这种错误是非常隐蔽的。
老师告诉我们不释放空间,这是编程序的一个大忌。
另外你的程序除了楼上门所说的那些问题外,你还应该注意程序的格式,这很重要的。
呵呵,以上只是小弟的一点建议,希望不要被贻笑大方。


[此贴被 ziaichen(ziaichen) 在 11月14日17时16分 编辑过]


[此贴被 ziaichen(ziaichen) 在 11月27日17时07分 编辑过]

B17层 发表时间: 11/14 17:55

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号