关于swich语句

来源:百度知道 编辑:UC知道 时间:2024/05/15 04:10:20
为什么当我输入选择为字母时,程序会进入死循环
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void main()
{
int n,i;
int c=0;
while(1) //打印主菜单//
{
printf("***********************************************\n");
printf("*****************请选择输入********************\n");
printf("****** 1.插入新进程 **********\n");
printf("****** 2.运行所有进程,并显示运行顺序**********\n");
printf("****** 3.运行队首进程 **********\n");
printf("****** 4.清空进程 **********\n");
printf("****** 5.查看当前所有进程 **********\n");
printf("****** 6.退出 **********\n");
printf("***********************************************\n");
scanf("%d",&c);
switch(c)
{
case 1:
。。。。。。(中间语句

嘻嘻,我给您解释一下~
事情是这样的~
这得从scanf特点说起。
它与其它函数不同,它从标准输入流中顺序地取得信息。
scanf每读取一个信息,输入流会改变(去掉输入流中被scanf读取的信息)
例如:
输入流为:1 2 3 4 a b c
当运行到scanf(%d, &i)时,
1被读取到变量i中,
此时,输入流变为:2 3 4 a b c
如果此时遇到scanf(%c, &a);此函数准备读取输入流中的信息,但输入流中第一个信息是数字2,此时,scanf(%c, &a)无法读取输入流中的信息,所以输入流仍然为:2 3 4 a b c
这样,再来您的这段代码来说:
当您输入字母时,例如输入的是 b,
那么此时输入流为:b
当运行到scanf("%d", &c);时,而scanf("%d",...)是读取数字信息的,此函数未能读取字符信息,所以输入流仍然是:b。此时整形变量c的值未被改变。
当程序运行一个循环后又到了scanf("%d", &c);时,因为输入流为: b,所以仍然无法读取,输入流仍然是:b。就这么无限循环下去了。
如果希望输入字母程序能够不进入死循环,可以在循环里写一个类似:scanf("%c", &a)这样的语句,这样,如果在输入流中遇到的是字母,这个函数会把字母取出来,你的这段代码就不会死循环下去啦~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~
==================================
补充,楼上的朋友你们为什么不仔细看呀,
问题里面已经含有这个语句了:“。。。。。。(中间语句省略)”
说明楼主的代码里已经有跳出循环的语句,
比如:
case 6:
return 0;

其实楼主所要解决的问题是为什么输入字符后看起来程序不受控制了,这是关键的地方,楼主如果真要把问题弄得明明白白,那您就要仔细看一下标准输入流那个地方,它是一个缓冲区,应该说是一个队