为什么回显的汉字不对,或者说getch()两次如何得到的是同一个值。

为什么回显的汉字不对,或者说getch()两次怎么得到的是同一个值。。。。
新手,程序写的很乱,可能看的很不舒服  ,但是还是希望有人能帮忙解决下,本来汉字两个字符,希望是用两个getch()接下来然后输出回显,但是很奇怪的是两次getch()都是汉字的高位,弄不明白。。。


/***********************************************************************
函数名:  Input_Text
函数功能:带回显的输入函数,明文-nFlag=1,密文-nFlag=0
参数说明:char *buf     指向用来保存输入的数据的地址
  int nLength   控制输入数据长度
  int nFlag     控制回显信息:明文-nFlag=1,密文-nFlag=0
返回值:  无
***********************************************************************/
int Input_Text(char *buf,int nLength,int nFlag)
{
int i = 0,j = 0;
char ch=0,ch1=0;

for(i=0;i>=0&&i<=nLength;i++)
{
if(nLength==i)
{
if(KEY_ENTER==getch())
{
return;
}
else if(KEY_BACK==getch())
{
if((unsigned char)*(buf+i-1)>=0xA1 && (unsigned char)*(buf+i-1)<=0xEF)
{
printf("\b \b\b \b");
i-=3;
continue;
}
else
{
printf("\b \b");
i-=2;
continue;
}
}
printf("\07");
i--;
continue;
}
*(buf+i)=getch();
if((*(buf+i)>='a' && *(buf+i)<='z') || (*(buf+i)>='A' && *(buf+i)<='Z') || (*(buf+i)>='0' && *(buf+i)<='9'))
{
if(1==nFlag)
{
printf("%c",*(buf+i));
}
else if(0==nFlag)
{
printf("*");
}
}
else if((unsigned char)*(buf+i)>=0xA1 && (unsigned char)*(buf+i)<=0xEF)
{

if(i>=0 && i<(nLength-1))
{

if(1==nFlag)
{
*(buf+i+1)=getch();
printf("%c%c",*(buf+i),*(buf+i+1));
}
else if(0==nFlag)
{
printf("*");
}
i++;
continue;
}
else
{
*(buf+i)=0;
printf("\07");
i--;
continue;
}
}
else if(KEY_ENTER==*(buf+i))
{
*(buf+i)=0;
return;
}
else if(KEY_BACK==*(buf+i))
{
if(0==i)
{
i--;
printf("\07");
continue;
}
else
{
if((unsigned char)*(buf+i-1)>=0xA1 && (unsigned char)*(buf+i-1)<=0xEF)
{
printf("\b \b\b \b");
*(buf+i-2)=0;
i-=3;
continue;
}
else
{
printf("\b \b");
*(buf+i-1)=0;
i-=2;
continue;
}
}
}
else
{
*(buf+i)=0;
printf("\07");
i--;
continue;
}
}

return 0;
}
------解决方案--------------------
仅供参考
#include <conio.h>
#include <stdio.h>
char pw[40];
int i,ch;
FILE *f;
void main() {
    cprintf("\r\nPassword:");
    i=0;pw[i]=0;
    while (1) {
        ch=getch();
        if (ch==13 
------解决方案--------------------
 i>=39) break;
        switch (ch) {
        case 27:
            cprintf("\rPassword: %40s"," ");
            cprintf("\rPassword: ");
            i=0;pw[i]=0;
            break;
        case 8:
            if (i>0) {
                i--;
                pw[i]=0;
                cprintf("\b \b");
            }
            break;
        default:
            pw[i]=ch;
            i++;
            pw[i]=0;
            cprintf("*");
            break;
        }
    }
    cprintf("\r\n");
    f=fopen("password.txt","w");
    fprintf(f,"%s\n",pw);
    fclose(f);
}