当前位置: 代码迷 >> C语言 >> [求助]急!急!急!SWITCH 问题
  详细解决方案

[求助]急!急!急!SWITCH 问题

热度:171   发布时间:2007-04-24 08:33:53.0
以下是引用laigaoat2005在2007-4-23 20:52:00的发言:
我刚才看了你给别人是这样回的。

你问的问题不知是否可以这样理解?
就是getchar()每次只能接收一个字符,但是用户一次键入多个字符后,他先接收一个,等到第二次再接收一个……?

我瞎猜的,不知对不对。
我想重新编一个,编了好久都没有弄出来。

你的“瞎猜”OK!!!
用户一次键入多个字符后,这些字符(的ASCII编码)被操作系统自动存放到“键盘缓冲区”
getchar( )每次从该缓冲区取走一个字符。如果缓冲区空了,getchar()就不得不等待用户
输入。


----------------解决方案--------------------------------------------------------

将程序改如下就可以了:
#define N 20
#include<stdio.h>
#include<bios.h>

int main(void)
{
int i=0;
char c;

for(i=0;i<N;i++)
{
/* c=getchar();*/
c=bioskey(0);
switch (c)
{
case '0':printf("zero ");break;
case '1':printf("one ");break;
case '2':printf("two ");break;
case '3':printf("three ");break;
case '4':printf("four ");break;
case '5':printf("five ");break;
case '6':printf("six ");break;
case '7':printf("seven ");break;
case '8':printf("eight ");break;
case '9':printf("nine ");break;
}
}
}

就可以每输入一个字符,它就输出相应的英文字母;
如果用getchar()函数:
用户一次键入多个字符后,这些字符(的ASCII编码)被操作系统自动存放到“键盘缓冲区”
getchar( )每次从该缓冲区取走一个字符。如果缓冲区空了,getchar()就不得不等待用户
输入。


----------------解决方案--------------------------------------------------------
c=bioskey(0);

做何解~???

----------------解决方案--------------------------------------------------------

我没用bioskey()这个函数,因为不会
用的还是getchar(),只不过用了EOF做为结束输入的标志。此外,int也可以存char的数据吧

int main(void)
{
int c=0;
c=getchar();
while(c!=EOF)
{
switch (c)
{
case '0':printf("zero ");break;
case '1':printf("one ");break;
........ //略去
}
c=getchar();
}
}


----------------解决方案--------------------------------------------------------
回复:(oclassic)[求助]急!急!急!SWITCH ...

11楼:

你的“瞎猜”OK!!!
用户一次键入多个字符后,这些字符(的ASCII编码)被操作系统自动存放到“键盘缓冲区”
getchar( )每次从该缓冲区取走一个字符。如果缓冲区空了,getchar()就不得不等待用户
输入。


谢谢,我能明白你的意思了。但是对于“键盘缓冲区”我不太懂,请问你能讲明白些吗?关于getchar()与“键盘缓冲区”的知识?谢谢了。请你吃西瓜:


----------------解决方案--------------------------------------------------------
同意八神的话
----------------解决方案--------------------------------------------------------

bioskey()
功能:键盘接受
原型:void(int cmd)
头文件:bios.h
实例:以下是一个用方向键控制的小人移动的代码
#include<stdio.h>
#include<bios.h>
#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define ESC 0x11b
#define NUM 219
void main()
{
int key,x,y,a,b;
int i,j;
clrscr();
for(i=20;i<=60;i++)
{
gotoxy(i,4);
printf("%c",NUM);
gotoxy(i,21);
printf("%c",NUM);
}
for(i=4;i<=21;i++)
{
gotoxy(19,i);
printf("%c",NUM);
gotoxy(61,i);
printf("%c",NUM);
gotoxy(18,i);
printf("%c",NUM);
gotoxy(62,i);
printf("%c",NUM);
}
gotoxy(40,10);
x=40;
y=10;
printf("\1");
gotoxy(x,y);
for(;;)
{
a=x;
b=y;
key=bioskey(0);
switch(key)
{
case UP:
{
y--;
if(y==4)
{
y++;
b++;
}
gotoxy(x,y);
}break;
case DOWN:
{
y++;
if(y==21)
{
y--;
b--;
}
gotoxy(x,y);
}break;
case LEFT:
{
x--;
if(x==19)
{
x++;
a++;

}
gotoxy(x,y);
}break;
case RIGHT:
{
x++;
if(x==61)
{
x--;
a--;
}
gotoxy(x,y);
}break;
case ESC : exit(0);
default: continue;
}
printf("\1");
gotoxy(a,b);
printf(" ");
gotoxy(x,y);
}
}


----------------解决方案--------------------------------------------------------
尽量不要用getchar() 应该用标准的格式 输入输出.
在说了, 回车, 空格 ,都是字符, 你的那个程序不能很好的执行的 !
我改动了一点儿 当输入负数时 退出.
#include<stdio.h>
int main(void)
{
int i=0,c;

scanf("%d",&c);

while(c>=0)
{

switch (c)
{
case 0 :printf("zero "); break;
case 1 :printf("one "); break;
case 2 :printf("two "); break;
case 3 :printf("three "); break;
case 4 :printf("four "); break;
case 5 :printf("five "); break;
case 6 :printf("six "); break;
case 7 :printf("seven "); break;
case 8 :printf("eight "); break;
case 9 :printf("nine "); break;
default : printf("NULL");
}
scanf("%d",&c);
}

}
对于那个getchar()函数 一定要按enter才能将字符送入内存(enter作为此函数的结束符),一旦定义为字符型,不管是getchar()或格式化的scanf()都会不停的接受字符(能接受多少我也不是很清楚,应该和缓冲区定义的大小有关,缓冲满了就会丢弃后面的字符),并把这些字符依次送入内存,就好象一个循环似的,直到字符结束为止.

所以楼主的程序 比如一次输入1234 就会输出onetwothreefour 并且已经循环了5次.别忘了回车也算一次呢. 这不是什么缓冲区的问题,纯粹的函数参数就是这么定义的. 当然了既然你把getchar()赋给一个字符,但是原来内存中的那些字符后面的区域还在,记住回车才是结束符.输入函数就好象一个循环似的. 在每次getchar()参数递增的同时,i也在增
就造成了 那样的结果.

[此贴子已经被作者于2007-4-25 16:09:16编辑过]


----------------解决方案--------------------------------------------------------
以下是引用dqq74fox在2007-4-24 9:33:16的发言:

将程序改如下就可以了:
#define N 20
#include<stdio.h>
#include<bios.h>

int main(void)
{
int i=0;
char c;

for(i=0;i<N;i++)
{
/* c=getchar();*/
c=bioskey(0);
switch (c)
{
case '0':printf("zero ");break;
case '1':printf("one ");break;
case '2':printf("two ");break;
case '3':printf("three ");break;
case '4':printf("four ");break;
case '5':printf("five ");break;
case '6':printf("six ");break;
case '7':printf("seven ");break;
case '8':printf("eight ");break;
case '9':printf("nine ");break;
}
}
}

就可以每输入一个字符,它就输出相应的英文字母;
如果用getchar()函数:
用户一次键入多个字符后,这些字符(的ASCII编码)被操作系统自动存放到“键盘缓冲区”
getchar( )每次从该缓冲区取走一个字符。如果缓冲区空了,getchar()就不得不等待用户
输入。

呵呵 !
正解啊
学习。。。
----------------解决方案--------------------------------------------------------

因为放了一个for 语句,搞成循环.真不懂一定要放哪个干什么...


----------------解决方案--------------------------------------------------------
  相关解决方案