首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个关于输入的老有关问题,但很久没有得到解答

2012-02-19 
一个关于输入的老问题,但很久没有得到解答我们常常会用标准输入函数“scanf()”接收来自键盘的输入,但输入之

一个关于输入的老问题,但很久没有得到解答
我们常常会用标准输入函数“scanf()”接收来自键盘的输入,但输入之后却往往不免要按下   Enter   键,这就带来一个麻烦。例如,我想现在屏幕上打印好如下文字:

年:(1)   月:(2)   日:(3)

其中的编号(1)、(2)、(3)本来不存在,是我为了说明问题而特意加上去的,表示位置(1)、位置(2)、位置(3)。现在问题来了,如何保证我在位置(1)处输入了一个表示年份的数之后光标直接跳到位置(2)处准备接收表示月份的数目,等位置(2)处的数目输入之后再自动跳到位置(3)处准备接收表示日的数目,等所有数目全部接收完毕再进行到程序的下一步。总而言之,就是如何保证用“scanf()”接收输入并按下Enter键之后还能保证光标停在同一行预备下一步程序行为。其实,getchar()函数也有同样的问题,看看哪位探讨一下这方面的问题。我利用gech()函数和TAB键合作完成了从键盘接收字符(串)然后将字符串转换成整型量的过程,代码如下:

/*   character   digits   to   number   */

#include   <stdio.h>
#include   <math.h>

#define   N   100

int   mypow(int,int);                                                   //一个函数,计算一个整数的正整数次幂
void   input(void);                                                       //此函数从键盘接收字符(串)并将其转化为整型量

int   main(void){
       
        printf( "\nYear:   ");
        input();
        printf( "   Month:   ");
        input();
        printf( "   Day:   ");
        input();
       
        getch();
       
        return   0;
}

void   input(){
         
        char   key,   input[N];
        char   *chpt   =   input;                             //指针*chpt用来记录输入的字符并将其装载进字符数组input[N];
        int   i,j;
        int   base[N]   =   {0};
        int   cnt   =   0,num   =   0;                         //cnt用来记录输入字符的数量,num是字符量转化后的结果,即整型量
             
        while((key   =   getch())   !=   '\t '){
               
                putchar(key);                                                     //打印用getch()接收的来自键盘的字符(串)
                *chpt   =   key;                                                     //   记录键盘输入字符(串)
                chpt++;                                                                     //装载字符(串)入字符数组
                cnt++;
        }
       
        for(i   =   0;   i   <   cnt;   i++){


                   
                switch(input){                                         //此开关负责将字符量转化为整型量
                       
                        case   '0 ':
                                 
                                  base   =   0;
                                  break;
                       
                        case   '1 ':
                                 
                                  base   =   1;
                                  break;
                       
                        case   '2 ':
                                 
                                  base   =   2;
                                  break;
                       
                        case   '3 ':
                                 
                                  base   =   3;
                                  break;
                       
                        case   '4 ':
                                 
                                  base   =   4;
                                  break;
                       
                        case   '5 ':
                                 


                                  base   =   5;
                                  break;
                       
                        case   '6 ':
                                 
                                  base   =   6;
                                  break;
                       
                        case   '7 ':
                                 
                                  base   =   7;
                                  break;
                       
                        case   '8 ':
                                 
                                  base   =   8;
                                  break;
                       
                        case   '9 ':
                                 
                                  base   =   9;
                                  break;
                       
                        default:   break;
                }
        }
       
             
        j   =   cnt;

        for(i   =   0;   i   <   cnt;   i++)    
             
                num   +=   base   *   mypow(10,--j);         //此过程将各个数位上的数字用权来乘
                                                              //然后将各个数位上的数加起来就是所要的整数


               
}

int   mypow(int   base,   int   index){
       
        int   i,res   =   1;
       
        for(i   =   0;   i   <   index;   i++)
                   
                    res   *=   base;                           //此过程是将一个整数自乘n次以获得它的n次幂
       
        return   res;
}


以上程序的一个最大问题就是每当输入一串字符,例如在“Year”输入1999之后如果按下乐Enter,则光标跳到该行的开头然后程序就死掉乐,没有任何反应。请各位齐来探讨一下如何让“scanf()”和“getchar()”在接收输入并按下Enter键之后不再让光标跳到下一行而是让它停在同一行或跳到同一行的下一个接收输入的位置。谢谢!

[解决办法]
就是如何保证用“scanf()”接收输入并按下Enter键之后还能保证光标停在同一行预备下一步程序行为
========
不认为存在可行性 ...

想想就知道,
scanf 必须要求敲回车将输入缓冲中的数据送予处理,
但是,问题就是这里了,回车,怎么能不换行?

不过可以借助一个方法,
比如 gotoxy 函数,但是它不是标注库函数,不一定可用;
当然可以借助API, 比如 SetConsoleCursorInfo ...
[解决办法]
为达到这个目的,还不如用 getch():

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


int main()
{
int y=0, m=0, d=0, count=0;
char ch;

printf( "year: ");
while(count <4)
{
ch=getch();
putchar(ch);
count++;
y = y*10 + ch- '0 ';
}

printf( " month: ");
count =0;
while(count <2)
{
ch=getch();
putchar(ch);
count++;
m = m*10 + ch- '0 ';
}

printf( " day: ");
count =0;
while(count <2)
{
ch=getch();
putchar(ch);
count++;
d = d*10 + ch- '0 ';
}

printf( "\nThe date is: %d-%d-%d\n ", y, m, d);

system( "PAUSE ");
return 0;
}

热点排行