死循环问题

taiyia2009 2010-03-29 11:21:28
这是 cpp文件的主要的一部分,我想每次输完一个数,例如1,执行完程序后会再显示除了标题 “各 种 排 序 算 法 效 率 分 析”外的剩下的那些排序名称,我便可再选择一个数,如2,再执行……按0会停止。但这个程序并不可以这样,而是选了1 后choice就一直是1了,一直循环下去,不再scanf了。为什么?有谁有解决办法吗?谢谢。

void main(){
//char ch;
int choice;
printf("-------------------------------------------------------\n");
printf("| |\n");
printf("| 各 种 排 序 算 法 效 率 分 析 |\n");
printf("| |\n");
printf("|-----------------------------------------------------|\n");
printf("|-----------------------------------------------------|\n");
printf("| 1.直接插入排序 |\n");
printf("| 2.折半插入排序 |\n");
printf("| 3.希尔排序 |\n");
printf("| 4.冒泡排序 |\n");
printf("| 5.快速排序 |\n");
printf("| 6.简单选择排序 |\n");
printf("| 7.堆排序 |\n");
printf("| 8.非递归归并排序 |\n");
printf("| 9.基数排序 |\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("| 0.Exit System |\n");
printf("|-----------------------------------------------------|\n");
printf("# Please Input Your Choose #\n");
printf("|-----------------------------------------------------|\n");


scanf("%d",&choice);

//while(scanf("%d",&num)!=EOF&&num!=0)
while(choice!=0)
{

//cin>>choice;
//scanf("%d",&choice);
//getchar();
switch(choice)
{
case 1: main1() ;break;
case 2: main2() ;break;
case 3: main3() ;break;
case 4: main4() ;break;
case 5: main5() ;break;
case 6: main6() ;break;
case 7: main7() ;break;
case 8: main8() ;break;
case 9: main9() ;break;

//case '0': exit(0);

default: break;
}
printf("|-----------------------------------------------------|\n");
printf("| 1.直接插入排序 |\n");
printf("| 2.折半插入排序 |\n");
printf("| 3.希尔排序 |\n");
printf("| 4.冒泡排序 |\n");
printf("| 5.快速排序 |\n");
printf("| 6.简单选择排序 |\n");
printf("| 7.堆排序 |\n");
printf("| 8.非递归归并排序 |\n");
printf("| 9.基数排序 |\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("| 0.Exit System |\n");
printf("|-----------------------------------------------------|\n");
printf("# Please Input Your Choose #\n");
printf("|-----------------------------------------------------|\n");
scanf("%d",&choice);

}


}
...全文
271 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
taiyia2009 2010-03-31
  • 打赏
  • 举报
回复
我参照http://read.pudn.com/downloads95/sourcecode/windows/file/386757/%E6%96%B0%E9%97%BB%E5%8F%91%E5%B8%83%E7%B3%BB%E7%BB%9F/%E6%96%B0%E9%97%BB%E5%8F%91%E5%B8%83%E7%B3%BB%E7%BB%9F/%E6%BA%90%E6%96%87%E4%BB%B6/SearchNews.c__.htm
修改了一下,可以了。谢谢大家!这里贴上代码:
#include "head.h"
#include "直接插入排序.cpp"
#include "折半插入排序.cpp"
#include "希尔排序.cpp"
#include "冒泡排序.cpp"
#include "快速排序.cpp"
#include "简单选择排序.cpp"
#include "堆排序.cpp"
#include "由别人修改得非递归归并排序.cpp"
#include "基数排序.cpp"
#include <iostream.h>
#include <stdio.h>
#include <conio.h>

void menu(){

printf("-------------------------------------------------------\n");
printf("| |\n");
printf("| 各 种 排 序 算 法 效 率 分 析 |\n");
printf("| |\n");
printf("|-----------------------------------------------------|\n");
printf("|-----------------------------------------------------|\n");
printf("| 1.直接插入排序 |\n");
printf("| 2.折半插入排序 |\n");
printf("| 3.希尔排序 |\n");
printf("| 4.冒泡排序 |\n");
printf("| 5.快速排序 |\n");
printf("| 6.简单选择排序 |\n");
printf("| 7.堆排序 |\n");
printf("| 8.非递归归并排序 |\n");
printf("| 9.基数排序 |\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("| 0.Exit System |\n");
printf("|-----------------------------------------------------|\n");
printf("# Please Input Your Choose #\n");
printf("|-----------------------------------------------------|\n");
}




void main()
{
char choose,yes_no;

while(1)
{
//system("cls");
menu();
do
{
choose=getch();
}
while(choose<'0' || choose>'9');

switch(choose)
{
case '1':main1(); break;
case '2':main2(); break;
case '3':main3(); break;
case '4':main4(); break;
case '5':main5(); break;
case '6':main6(); break;
case '7':main7(); break;
case '8':main8(); break;
case '9':main9(); break;



//case '5': return; //返回上级菜单
case '0': break; //退出
}


if(choose=='0')
{
printf("\n 确定退出(Y/N)?\n");
do
{
yes_no=tolower(getch());
}
while(yes_no!='y' && yes_no!='n');
}
if(yes_no=='y')
exit(0);
}
}

taiyia2009 2010-03-31
  • 打赏
  • 举报
回复
三楼那位,我照搬你的试了一下,单独这个程序是可以,可是修改了一下,搬到我那儿就不行了,还是老样子,死循环。可能是我的main1(),main2()~main9()都是有int返回值的吧。给你看搬到我那儿的程序:

#include "head.h"
#include "直接插入排序.cpp"
#include "折半插入排序.cpp"
#include "希尔排序.cpp"
#include "冒泡排序.cpp"
#include "快速排序.cpp"
#include "简单选择排序.cpp"
#include "堆排序.cpp"
#include "由别人修改得非递归归并排序.cpp"
#include "基数排序.cpp"
#include <iostream.h>
#include <stdio.h>
#include <conio.h>

void menu(){

printf("-------------------------------------------------------\n");
printf("| |\n");
printf("| 各 种 排 序 算 法 效 率 分 析 |\n");
printf("| |\n");
printf("|-----------------------------------------------------|\n");
printf("|-----------------------------------------------------|\n");
printf("| 1.直接插入排序 |\n");
printf("| 2.折半插入排序 |\n");
printf("| 3.希尔排序 |\n");
printf("| 4.冒泡排序 |\n");
printf("| 5.快速排序 |\n");
printf("| 6.简单选择排序 |\n");
printf("| 7.堆排序 |\n");
printf("| 8.非递归归并排序 |\n");
printf("| 9.基数排序 |\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("| 0.Exit System |\n");
printf("|-----------------------------------------------------|\n");
printf("# Please Input Your Choose #\n");
printf("|-----------------------------------------------------|\n");
}







int main(int argc, char* argv[])
{
menu();

char choice = getchar();

while(choice!='0')
{

switch(choice)
{
case '1': main1() ;break;
case '2': main2() ;break;
case '3': main3() ;break;
case '4': main4() ;break;
case '5': main5() ;break;
case '6': main6() ;break;
case '7': main7() ;break;
case '8': main8() ;break;
case '9': main9() ;break;

//case '0': exit(0);

default: break;
}

menu();
choice = getchar();

}

return 0;
}




maixl 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 taiyia2009 的回复:]
我试着加了fflush(stdin);
或scanf("%d",&choice);=》
if(0 == scanf("%d",&choice))
{
printf("input error, flush the buffer.\n");
fflush(stdin);
}
都不行啊。难道就没有办法了?
[/Quote]

能进到if语句里吗?你用的是什么编译器?

fflush(stdin)不是所有的平台都支持的,

要是不行那你把choice定义成char类型,
scanf("%c",&choice),case 也换成1到9的字符
Zsen_J 2010-03-31
  • 打赏
  • 举报
回复
你输入的是char 不是int
chen_wenyue 2010-03-30
  • 打赏
  • 举报
回复
三楼我不是贴了代码给你嘛,你没试试?
taiyia2009 2010-03-30
  • 打赏
  • 举报
回复
单独写一个函数
还是不行啊!我觉得好怪异啊!
BT六眼飞鱼 2010-03-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 maixl 的回复:]

这个是缓冲区所至,scanf跟cin一样都是要用缓冲区,如果出入错误,scanf并不冲洗缓冲区,所以循环遇到scanf,系统看到缓冲区里有数据就直接读取他。

int choice是int类型,当你输入字符时就会出错,这就是你为什么看到一直循环的原因。

你可以在while语句里的出入判断是否出错,如果出错手动冲洗缓冲区就可以了,把你这句话改下:
scanf("%d",&cho……
[/Quote]
UP~~~
jhk6666 2010-03-30
  • 打赏
  • 举报
回复
你这相当于有两个循环需要维护
用多线程?
maixl 2010-03-30
  • 打赏
  • 举报
回复
这个是缓冲区所至,scanf跟cin一样都是要用缓冲区,如果出入错误,scanf并不冲洗缓冲区,所以循环遇到scanf,系统看到缓冲区里有数据就直接读取他。

int choice是int类型,当你输入字符时就会出错,这就是你为什么看到一直循环的原因。

你可以在while语句里的出入判断是否出错,如果出错手动冲洗缓冲区就可以了,把你这句话改下:
scanf("%d",&choice);=》

if(0 == scanf("%d",&choice))
{
printf("input error, flush the buffer.\n");
fflush(stdin);
}
wj198895 2010-03-30
  • 打赏
  • 举报
回复
int choice;
printf("-------------------------------------------------------\n");
printf("| |\n");
printf("| 各 种 排 序 算 法 效 率 分 析 |\n");
printf("| |\n");
printf("|-----------------------------------------------------|\n");
printf("|-----------------------------------------------------|\n");
printf("| 1.直接插入排序 |\n");
printf("| 2.折半插入排序 |\n");
printf("| 3.希尔排序 |\n");
printf("| 4.冒泡排序 |\n");
printf("| 5.快速排序 |\n");
printf("| 6.简单选择排序 |\n");
printf("| 7.堆排序 |\n");
printf("| 8.非递归归并排序 |\n");
printf("| 9.基数排序 |\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("| 0.Exit System |\n");
printf("|-----------------------------------------------------|\n");
printf("# Please Input Your Choose #\n");
printf("|-----------------------------------------------------|\n");


scanf("%d",&choice);
单独写一个函数
当switch 执行完后再调用这个函数就应该可以了
cxlong89 2010-03-30
  • 打赏
  • 举报
回复
//case '0': exit(0);
错了
case 0: exit(0);

你输入的是int 不是char


void main(){
//char ch;
int choice;
printf("-------------------------------------------------------\n");
printf("| |\n");
printf("| 各 种 排 序 算 法 效 率 分 析 |\n");
printf("| |\n");
printf("|-----------------------------------------------------|\n");
printf("|-----------------------------------------------------|\n");
printf("| 1.直接插入排序 |\n");
printf("| 2.折半插入排序 |\n");
printf("| 3.希尔排序 |\n");
printf("| 4.冒泡排序 |\n");
printf("| 5.快速排序 |\n");
printf("| 6.简单选择排序 |\n");
printf("| 7.堆排序 |\n");
printf("| 8.非递归归并排序 |\n");
printf("| 9.基数排序 |\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("| 0.Exit System |\n");
printf("|-----------------------------------------------------|\n");
printf("# Please Input Your Choose #\n");
printf("|-----------------------------------------------------|\n");


scanf("%d",&choice);

//while(scanf("%d",&num)!=EOF&&num!=0)
while(choice!=0)
{

//cin>>choice;
//scanf("%d",&choice);
//getchar();
switch(choice)
{
case 1:printf("1"); break;
case 2:printf("2"); break;
case 3:printf("3"); break;
case 4:printf("4"); break;
case 5:printf("5"); break;
case 6:printf("6"); break;
case 7:printf("1"); break;
case 8:printf("1"); break;
case 9:printf("1"); break;

case 0: exit(0);

default: break;
}
printf("|-----------------------------------------------------|\n");
printf("| 1.直接插入排序 |\n");
printf("| 2.折半插入排序 |\n");
printf("| 3.希尔排序 |\n");
printf("| 4.冒泡排序 |\n");
printf("| 5.快速排序 |\n");
printf("| 6.简单选择排序 |\n");
printf("| 7.堆排序 |\n");
printf("| 8.非递归归并排序 |\n");
printf("| 9.基数排序 |\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("| 0.Exit System |\n");
printf("|-----------------------------------------------------|\n");
printf("# Please Input Your Choose #\n");
printf("|-----------------------------------------------------|\n");
scanf("%d",&choice);

}


}



taiyia2009 2010-03-30
  • 打赏
  • 举报
回复
我试着加了fflush(stdin);
或scanf("%d",&choice);=》
if(0 == scanf("%d",&choice))
{
printf("input error, flush the buffer.\n");
fflush(stdin);
}
都不行啊。难道就没有办法了?
赵4老师 2010-03-30
  • 打赏
  • 举报
回复
fflush(stdin);
这句应该加在scanf之前。
juniorli 2010-03-30
  • 打赏
  • 举报
回复
楼主用单步调试吧!逻辑错误比语法错误难找
chen_wenyue 2010-03-29
  • 打赏
  • 举报
回复

#include "stdafx.h"
#include <iostream>

void Banner()
{
printf("-------------------------------------------------------\n");
printf("| |\n");
printf("| 各 种 排 序 算 法 效 率 分 析 |\n");
printf("| |\n");
printf("|-----------------------------------------------------|\n");
printf("|-----------------------------------------------------|\n");
printf("| 1.直接插入排序 |\n");
printf("| 2.折半插入排序 |\n");
printf("| 3.希尔排序 |\n");
printf("| 4.冒泡排序 |\n");
printf("| 5.快速排序 |\n");
printf("| 6.简单选择排序 |\n");
printf("| 7.堆排序 |\n");
printf("| 8.非递归归并排序 |\n");
printf("| 9.基数排序 |\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("| 0.Exit System |\n");
printf("Please Input Your Choose(0-9): ");
}

void main1()
{
}

void main2()
{
}

void main3()
{
}
void main4()
{
}
void main5()
{
}
void main6()
{
}
void main7()
{
}
void main8()
{
}
void main9()
{
}

int main(int argc, char* argv[])
{
Banner();

char choice = getchar();

while(choice!='0')
{

switch(choice)
{
case '1': main1() ;break;
case '2': main2() ;break;
case '3': main3() ;break;
case '4': main4() ;break;
case '5': main5() ;break;
case '6': main6() ;break;
case '7': main7() ;break;
case '8': main8() ;break;
case '9': main9() ;break;

//case '0': exit(0);

default: break;
}

Banner();
choice = getchar();

}

return 0;
}



错在你在case语句时,判断输入的字符时,要加上'',键盘输入的是字符,如果要按数字来判断的话,输入的字符0的整数值是48
cattycat 2010-03-29
  • 打赏
  • 举报
回复
那main1() 是干什么的?这里边是不是有循环呢
yuzl32 2010-03-29
  • 打赏
  • 举报
回复
不会啊,挺好的。

#include <stdio.h>

void main()
{
//char ch;
int choice;
printf("-------------------------------------------------------\n");
printf("| |\n");
printf("| 各 种 排 序 算 法 效 率 分 析 |\n");
printf("| |\n");
printf("|-----------------------------------------------------|\n");
printf("|-----------------------------------------------------|\n");
printf("| 1.直接插入排序 |\n");
printf("| 2.折半插入排序 |\n");
printf("| 3.希尔排序 |\n");
printf("| 4.冒泡排序 |\n");
printf("| 5.快速排序 |\n");
printf("| 6.简单选择排序 |\n");
printf("| 7.堆排序 |\n");
printf("| 8.非递归归并排序 |\n");
printf("| 9.基数排序 |\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("| 0.Exit System |\n");
printf("|-----------------------------------------------------|\n");
printf("# Please Input Your Choose #\n");
printf("|-----------------------------------------------------|\n");


scanf("%d",&choice);

//while(scanf("%d",&num)!=EOF&&num!=0)
while(choice!=0)
{
//cin>>choice;
//scanf("%d",&choice);
//getchar();
switch(choice)
{
case 1: break;
case 2: break;
case 3: break;
case 4: break;
case 5: break;
case 6: break;
case 7: break;
case 8: break;
case 9: break;

//case '0': exit(0);

default: break;
}
printf("|-----------------------------------------------------|\n");
printf("| 1.直接插入排序 |\n");
printf("| 2.折半插入排序 |\n");
printf("| 3.希尔排序 |\n");
printf("| 4.冒泡排序 |\n");
printf("| 5.快速排序 |\n");
printf("| 6.简单选择排序 |\n");
printf("| 7.堆排序 |\n");
printf("| 8.非递归归并排序 |\n");
printf("| 9.基数排序 |\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("| 0.Exit System |\n");
printf("|-----------------------------------------------------|\n");
printf("# Please Input Your Choose #\n");
printf("|-----------------------------------------------------|\n");
scanf("%d",&choice);

}
}

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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