请教一个死循环的问题

zxywd 2010-04-02 01:29:20
大家好,这次遇到了一个死循环的问题。
代码如下:
getnumber.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main()
{
char *number=malloc(30),number_arr[30],*head="071080";
int i=0;
start:
printf("请输入学生学号,必须以071080开头,长度为8,全为数字:\n");
scanf("%s",number);
strcpy(number_arr,number);
while(*number!='\0')
{
if(!isdigit(*number))
goto start;
number++;
i++;
}
if(i!=8)
goto start;
for(i=0;i<6;i++)
{
if(number_arr[i]!=*head)
goto start;
head++;
}
strcpy(number,number_arr);
printf("%s\n",number);
return 0;
}
执行结果:
请输入学生学号,必须以071080开头,长度为8,全为数字:
07108009
07108009
这次执行时输入正确没有任何问题。
第二次:
请输入学生学号,必须以071080开头,长度为8,全为数字:
90374sf
请输入学生学号,必须以071080开头,长度为8,全为数字:
07108009
请输入学生学号,必须以071080开头,长度为8,全为数字:
07108009
请输入学生学号,必须以071080开头,长度为8,全为数字:

这次输入时,一开始没按要求输入,出现死循环。
这是什么原因,麻烦各位帮忙解决一下。谢谢。
...全文
129 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxywd 2010-04-02
  • 打赏
  • 举报
回复
根据4楼的代码,得到了理想的结果。非常感谢。也感谢其他各位热心的网友。
vanchristin 2010-04-02
  • 打赏
  • 举报
回复
看到goto就心里发毛……
楼主还是用while吧
单步运行,看到哪一句出现问题
huanmie_09 2010-04-02
  • 打赏
  • 举报
回复
还有尽量不要改动动态分配内存指针的指向,要不然该内存回收就回收不了,变为垃圾内存了。请将上面代码里的free(number);前面的注释去掉.
huanmie_09 2010-04-02
  • 打赏
  • 举报
回复
在start标签的下方,要将i置为0.不然,后面的长度算出来会不准.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main()
{
char *number=malloc(30), number_arr[30], *head="071080";
char *p;
int i = 0;

if(number == NULL) {
printf("malloc error!\n");
exit(1);
}
start:
memset(number, '\0', 30);
memset(number_arr, '\0', 30);

i = 0; //i要置0
printf("请输入学生学号,必须以071080开头,长度为8,全为数字:\n");
fflush(stdin);
scanf("%s", number);
strcpy(number_arr, number);

p = number;
while(*p != '\0') {
if(!isdigit(*p))
goto start;
p++;
i++;
}
if(i !=8 ) {
goto start;
}
p = head;
for(i=0; i<6; i++) {
if(number_arr[i] != *p)
goto start;
p++;
}
strcpy(number,number_arr);
printf("%s\n",number);
//free(number);
return 0;
}
zxywd 2010-04-02
  • 打赏
  • 举报
回复
如何重置,我也不知道。
十八道胡同 2010-04-02
  • 打赏
  • 举报
回复
c语言有输入错误标志位问题吗?
你需要重置一下
jbz001 2010-04-02
  • 打赏
  • 举报
回复
C语言中尽量不要使用goto
会导致程序混乱的
最近一直在研究爬虫和Lucene,虽然开始决定选用Heritrix来执行爬虫操作,但是后来发现用它来做还是存在一定的问题,比如需要程序生成相应的XML文件,对于同一个Job,怎样才能保证重复运行该Job时文件夹始终是同一个(Heritrix为Job创建文件夹的规则是“Job名称-时间戳”)等等,都是需要考虑的问题,最终还是将其搁浅。    后来google了一下,找到了一个简单爬虫的程序代码(http://www.blogjava.net/Jack2007/archive/2008/03/24/188138.html),随即试验了一下,发现确实能得到网页的内容,在这里还是要谢谢代码的提供者——Jack.Wang。    虽然试验成功,但是在随后的大数据量试验时,还是出现了问题。最初试验时,我只是让程序去抓取10个URL链接,当我将URL链接数改为100个时,问题出现了——URL中存在重复,而且非常容易的就变成死循环。举个例子来说,比如我首先爬的是A.html,在A.html中有两个链接:B.html,C.html,等爬完A.html以后,程序会爬B.html,这时如果B.html中的所有链接中有A.html这个页面的链接,那么程序又会去爬A.html这个页面,如此一来就形成了一个死循环,永远也不能停止。    跟踪程序发现,原来是在添加要抓取的网页的链接列表中,没有将已经抓取过的URL去除,所以才造成了死循环。现在虽然加上了这个判断,但是从我运行程序的效果来看,也不是很理想,总是感觉有些慢,800个页面要一两分钟才能爬完,这个我觉得有点说不过去。    这个产品,做到现在,我遇到了这么几个情况,有和大家分享的,也有向大家请教,求助的。    1.关于对应关系数据的保存方式    在创建索引的时候,需要将网页的URL和网页的内容传到相应的方法中,当然URL和内容是要对应的,也许是经验太少吧,我采取的是通过构建一个JavaBean的方式来传递的,不知道大家有没有更好的方法       2.关于要创建索引的内容的保存方式    最初的想法是不创建文件,直接将内容保存到变量中,然后创建索引,即先抓取网页的内容,然后将网页的内容和URL保存到自己构建的JavaBean对象中,接着将这个对象放到一个list列表中,等所有网页抓取完毕以后,将这个列表传到创建索引的方法中。这种做法看似不错,可是当URL数量很大时,会导致内存不够用,所以还是创建文件比较稳妥。    3.关于网页编码问题    遇到这个问题也是一个巧合,本来我抓取的是客户的一个网站,后来同事说如果客户看访问日志,这个月的数据会和平常的数据不一样,所以我就抓取公司的网站,结果,问题出现了。原先公司的网站是用GB2312编码做的页面,现在采用的是UTF-8的编码,虽然我已经判断了页面的编码,可是依然不能解决保存的文件中文乱码的问题,不知道大家有什么好办法没有。错误信息为:java.io.UnsupportedEncodingException    附件为爬虫代码 本文出自 “徘徊在c#,java,php之间” 博客,请务必保留此出处http://jerrysun.blog.51cto.com/745955/221879

69,373

社区成员

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

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