易码技术论坛

 找回密码
 加入易码
搜索
查看: 397259|回复: 20

[求助]关于scanf

[复制链接]
发表于 2005-7-21 13:08:00 | 显示全部楼层
帮帮忙啊!!!
发表于 2005-7-21 14:03:00 | 显示全部楼层
LavaX没有scanf,可自行实现。
发表于 2005-7-21 20:13:00 | 显示全部楼层
比如,输入数字
#define ENTER_KEY 13
#define LT_KEY 23
long inputn(char start)
{
int i;
int n,sign;
char ch,row,col;
long value;
char numberc[11];
char string[12];
row=start/20;col=start%20;
strcpy(numberc,"0bnmghjtyu");
memset(string,0,12);
sign=1;
n=0;
value=0;
for(;;)
{
n=strlen(string);
Locate(row,col);
memset(_TEXT+start,0,156-start);
printf("%s_",string);
ch=getchar();
for(i=0;i<10;i++)
if(ch==numberc){ch=i+'0';break;}
else if(ch==20)ch='-';

if(isdigit(ch)&&n<10)string[n]=ch;
else if (ch=='-')
{
   if(sign==1)
        {
           memmove(string+1,string,10);
           string[0]=ch;
         }
   else if(sign==-1){memmove(string,string+1,10);string[n-1]=0;}
   sign=-sign;
}
else if(ch==LT_KEY&n)string[n-1]=0;
else if (ch==ENTER_KEY&&n) {string[n]=0;break;}
}
            if(sign==1)i=0;else i=1;
             for(;i<n;i++)
                 {
                 ch=string;
                 value=value*10+(ch&0xf);
                 }
               return sign*value;
            
}

void main()
{
long value;
SetScreen(1);
value=inputn(0);
printf("\n%d",value);
getchar();
}
发表于 2005-7-21 20:14:00 | 显示全部楼层
输入字符串
#define LT_KEY 23
#define ENTER_KEY 13
void inputs(long object,char start,int maxlen)
{
    char Ch[3];
    int Pos,word,n;
    char mode,row,col;
    row=start/20;col=start%20;
    n=0 ;
    mode=0 ;
    Ch[2]=0 ;
    memset(object,0,maxlen);
    for(;;)
    {
        memset(_TEXT+start,0,100-start);
        n=strlen(object);
        Locate(row,col);
        printf("%s_",object);
     
        word=GetWord(mode);
        mode=3 ;
        Ch[0]=word ;
        
        if(isprint(Ch[0])&&n<maxlen)
        {
            *(object+n)=Ch[0];
            continue ;
        }
        
        else if(Ch[0]>=160&&n<maxlen)
        {
            Ch[1]=word>>8 ;
            strcpy(object+n,Ch);
            continue ;
        }
  
        else if(Ch[0]==LT_KEY&&n)
        {
           
            if(*(object)&160)
            {
                n--;
                memset(object+n-1,0,2);
            }
            else *(object+n-1)=0 ;
            continue ;
        }
        
        else if(Ch[0]==ENTER_KEY&&n)
        {
            *(object+n)=0 ;
            break ;
        }
        
        else if(Ch[0]==27)
        {
            memset(object,0,maxlen);
            return ;
        }
        
    }
   
}

void main()
{char string[32];
   
    printf("PLEASE INPUT:");
    inputs(string,20,30);
    printf("\n%s",string);
    getchar();
   
   
}
发表于 2005-7-23 02:28:00 | 显示全部楼层
相当于INPUT
发表于 2005-8-4 15:46:00 | 显示全部楼层
有没有搞错,实现这个如此麻烦,建议LEE加入相关函数!
发表于 2005-8-4 15:51:00 | 显示全部楼层
怕麻烦就别学编程。
发表于 2005-8-4 22:39:00 | 显示全部楼层
说的对啊
发表于 2005-8-5 10:02:00 | 显示全部楼层
我栽了!我在认真研究一下哦
发表于 2005-8-5 14:13:00 | 显示全部楼层
以下是引用leesoft在2005-8-4 15:51:03的发言:[BR]怕麻烦就别学编程。

语言创造着就应该考虑之后编程的人
应该给他们提供方便
除非....
发表于 2005-8-5 14:19:00 | 显示全部楼层
各种语言有各种语言的特性,不能说别的语言有什么其他语言也得有。
 楼主| 发表于 2005-9-2 10:47:00 | 显示全部楼层
楼上songfei给的那些好象有问题!
请再写一遍!
发表于 2005-9-2 14:20:00 | 显示全部楼层
贴一个我的吧
   

  1. 建立一个Input函数,用户输入一长串字符(注:此代码仅能使用于LavaX1.0,其他版本请将GetWord函数替换为相应的函数)
  2.     #define FONT_SMA   0
  3.     #define FONT_LAR   1
  4.     #define EDIT_INS   0
  5.     #define EDIT_OVR   1
  6.     #define KEY_LEFT   23
  7.     #define KEY_RIGHT  22
  8.     #define KEY_UP     20
  9.     #define KEY_DOWN   21
  10.     #define KEY_ENTER  13
  11.     #define KEY_SHIFT  18
  12.     #define KEY_CAPS   26
  13.     #define KEY_ESC    27
  14.     #define KEY_HELP   25
  15.     #define KEY_SPC    32
  16.     #define KEY_F1     28
  17.     #define KEY_F2     29
  18.     #define KEY_F3     30
  19.     #define KEY_F4     31
  20.     //文字缓存
  21.     char textBuf[100];
  22.     //保存地址,长度,显示坐标,字体
  23.     char Input(long textAdd,char length,char textX,char textY,char font){
  24.         char strPt;//字串指针、长度
  25.         char curX,curY,curL;//光标坐标、长度
  26.         int word;//获得的单个字符的ASCII或GB码
  27.         char editMode;
  28.         strPt=0;
  29.         word=0;
  30.         editMode=EDIT_INS;
  31.         if(font==FONT_SMA){//判断字体
  32.             curL=6;
  33.             curY=textY+11;
  34.         }
  35.         else{
  36.             curL=8;
  37.             curY=textY+15;
  38.         }
  39.         while(1){
  40.             Refresh();
  41.             TextOut(textX,textY,textAdd,0x40+0x80*font);//显示当前字串
  42.             curX=textX+strPt*curL;
  43.             if(editMode==EDIT_INS){//绘制光标
  44.                 if(*(textAdd+strPt)>=0xa1){Line(curX,curY,curX+curL*2-1,curY,2);}
  45.                 else{Line(curX,curY,curX+curL-1,curY,2);}
  46.             }else{
  47.             if(*(textAdd+strPt)>=0xa1){Box(curX,curY-curL*2,curX+curL*2-1,curY,1,2);}else
  48.                 {Box(curX,curY-curL*2,curX+curL-1,curY,1,2);}
  49.             }
  50.             word=GetWord(3);
  51.             if(word==KEY_ENTER||word==KEY_ESC){break;}
  52.             if(word==KEY_F1){//切换插入、覆盖
  53.                 if(editMode==EDIT_INS){editMode=EDIT_OVR;}
  54.                 else{editMode=EDIT_INS;}
  55.                 continue;
  56.             }
  57.             if(word==KEY_LEFT){//左移光标
  58.                 if(strPt>0){
  59.                     if(*(textAdd+strPt-1)>=0xa1){strPt=strPt-2;}
  60.                     else{strPt--;}
  61.                 }
  62.                 continue;
  63.             }
  64.             if(word==KEY_RIGHT){//右移光标
  65.                 if(strPt<strlen(textAdd)){
  66.                     if(*(textAdd+strPt)>=0xa1){strPt=strPt+2;}
  67.                     else{strPt++;}
  68.                 }
  69.                 continue;
  70.             }   
  71.             if(word==KEY_F2){//删除字符
  72.                 if(*(textAdd+strPt)==NULL){
  73.                     if(strPt>0){
  74.                         if(*(textAdd+strPt-1)>=0xa1){strPt=strPt-2;}
  75.                         else{strPt--;}
  76.                     }
  77.                 }
  78.                 if(*(textAdd+strPt)>=0xa1){strcpy(textBuf,textAdd+strPt+2);}
  79.                 else if(*(textAdd+strPt)!=0){strcpy(textBuf,textAdd+strPt+1);}
  80.                 strcpy(textAdd+strPt,textBuf);
  81.                 continue;
  82.             }
  83.             //加入字符
  84.             if(!isgraph(word&0xff) && (word>>8==0)){continue;}//合法字符
  85.             if(editMode==EDIT_INS||*(textAdd+strPt)==NULL){//插入模式,或是光标在最后为新加的字符腾出空间
  86.                 if(word>>8!=0&&strlen(textAdd)>=length-1){continue;}//判断长度是否超过规定长度
  87.                 if(word>>8==0&&strlen(textAdd)>=length){continue;}
  88.                 strcpy(textBuf,textAdd+strPt);
  89.                 if(word>>8!=0){strcpy(textAdd+strPt+2,textBuf);}
  90.                 else{strcpy(textAdd+strPt+1,textBuf);}
  91.             }
  92.             if(word>>8!=0){//汉字
  93.                 if(*(textAdd+strPt)<0xA1&&editMode==EDIT_OVR){//覆盖英文或数字
  94.                     if(strlen(textAdd)>=length)continue;
  95.                     strcpy(textBuf,textAdd+strPt);
  96.                     strcpy(textAdd+strPt+1,textBuf);
  97.                 }
  98.                 *(textAdd+strPt)=word&0xff;
  99.                 *(textAdd+strPt+1)=word>>8;
  100.                 strPt=strPt+2;
  101.             }else{//英文或数字
  102.                 if(strlen(textAdd)>=length&&*(textAdd+strPt)==NULL)continue;
  103.                 if(*(textAdd+strPt)>=0xA1&&editMode==EDIT_OVR){//覆盖汉字
  104.                     strcpy(textBuf,textAdd+strPt+1);
  105.                     strcpy(textAdd+strPt,textBuf);
  106.                 }
  107.                 *(textAdd+strPt)=word&0xff;
  108.                 strPt++;
  109.                 }
  110.         }
  111.         if(word==KEY_ESC)return 0;
  112.         return!0;
  113.     }
  114.     void main(){
  115.         char text[20];
  116.         memset(text,0,20);
  117.         Input(text,18,10,10,1);
  118.     }
复制代码

[此贴子已经被作者于2005-9-2 18:41:11编辑过]

发表于 2005-9-10 22:27:00 | 显示全部楼层
方案一:可以输入一个long型整数,也就是从-2147483648到2147483647间的任一整数。

方案二:只可输入一个小于256的整数。兄弟们不妨看看,进而指点指点,谢谢。。。

方案一:

/*可以输入带有负号long型整数*/<br>long inputn(int y,int x)<br>{int sign,k,i,j,num[10];<br>long n;<br>char ch,zm[11];<br>strcpy (zm,"0bnmghjtyu");<br>i=0;n=0;sign=1;<br>for (;;)<br>{ch=getchar();<br>for (k=0;k<10;k++)<br>if (ch==zm[k]) {num[i++]=k;Locate (y,x+i);printf ("%d",k);break;}<br>if (ch==13) break;<br>else if (ch==20&&i==0) {Locate(y,x+i);printf ("-");sign=sign*(-1);} <br>if (ch==23) {Locate (y,x+i);printf(" ");i--;if (sign==-1&&i==-1) {sign=1;i++;}}<br>}printf("\n");<br>for (j=0;j<i;j++)<br>n=n*10+num[j];<br>return (n*sign);<br>}<br>void main()<br>{long k,l;<br>SetScreen(1);<br>printf ("Input the num:");<br>k=inputn(1,0);<br>printf("The num is %d\n",k);printf("Input the sec num:");<br>l=inputn(4,0);printf("The sec num is %d\n",l);printf("k+l=%d",k+l);<br>getchar();<br>}

方案二:

void scanf(char p,long *x)<br>{int k,i,j,num[10];<br>char ch, zm[11];<br>strcpy (zm,"0bnmghjtyu");<br>i=0;<br>for (;;)<br>{ch=getchar();<br>for (k=0;k<10;k++)<br>if (ch==zm[k]) {num[i++]=k;Locate (0,0+i-1);printf ("%d",k);break;}<br>if (ch==13) break;<br>else if (ch==23) {Locate (0,0+i-1);printf(" ");i--;}<br>}printf("\n");<br>for (j=0;j<i;j++)<br>*x=*x*10+num[j];<br>}<br>void main()<br>{long k;<br>SetScreen(1);<br>printf ("");<br>scanf("%d",&k);<br>printf("The num is: %d\n",k);getchar();<br>}<br>

发表于 2005-10-13 20:19:00 | 显示全部楼层
真麻烦哈,但为了学lava,豁出去了。
发表于 2005-11-8 13:31:00 | 显示全部楼层
以下是引用abcdefg123在2005-9-2 10:47:00的发言:[BR]楼上songfei给的那些好象有问题!
请再写一遍!


埃、代码贴到论坛里就变形了
发表于 2005-12-13 19:08:00 | 显示全部楼层
可惜的只是输入一行,有什么用? TC800上的GetWord 已经写好了, 不过,只能用拼音输入法 可惜的是输入多行时不好处理,请高手帮忙
发表于 2006-3-17 01:02:00 | 显示全部楼层
啊哈~请问LEE是不是在LAVAX里面加入SCANF语句比较麻烦还是其它的原因?

如果有SCANF的话,程序就比较好吧~


发表于 2006-3-17 01:12:00 | 显示全部楼层
呵呵,我没有打算学什么LAVA哦
发表于 2006-3-17 13:51:00 | 显示全部楼层
scanf是给控制台程序用的,对于游戏以及图形界面程序没有任何帮助!
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-5-11 04:47 , Processed in 0.013057 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表