当前位置: 代码迷 >> C语言 >> 请大家帮我分析一下``谢谢先```
  详细解决方案

请大家帮我分析一下``谢谢先```

热度:239   发布时间:2007-12-14 06:29:46.0
请大家帮我分析一下``谢谢先```
我想实现的 就是  一般的 输入密码````

我碰到了一个问题```当我输入几个密码``如123``然后屏幕就显示***``
但是 ```当我退一格```因为密码有时候回按错``所以要退格啊```结果是```
*号没有消失```而是光标向后走了一格```这是怎么回事呢``不明白啊```
麻烦大家帮我分析分析``指点指点```

而当我按方向键的时候``回一下出现2个*``...............

更郁闷的是``` 我按回车的时候```循环竟然不段开```应该是出现死循环了````
但是为什么按回车都没反映呢???````很郁闷啊````


下面是我的代码:

#include <stdio.h>
#include <conio.h>

int main(void)
{
    char c, s[50] = {'0'};  
    int i = 0 ;
   
    while ( ( c=getch() ) != '\n' && c != EOF && i<50 )
    {
          if ( c == '\b' )
          {
            putchar(c) ;
               
            if ( !i )
               continue ;
            else
               --i ;
          }
          else
          {        
            putchar('*') ;
            s[i++] = c ;
          }
    }
   
    s[i] = '\0' ; i = 0 ;      
   
    return 0 ;
}

[[italic] 本帖最后由 死了都要C 于 2007-12-14 07:24 编辑 [/italic]]
----------------解决方案--------------------------------------------------------
我又单独试了下' \N'  结果````````

#include <stdio.h>
#include <conio.h>

int main(void)
{
    char c ;
   
    if (  ( c=getch() ) == '\n' )
       printf("OK\n");
    else
       printf("NO\n");
      
    getchar();
   
    return 0 ;
}


直接按回车```输出NO````但是我把getch()换成getchae()结果又是OK`````
我郁闷了`````谁帮帮我啊````````````
----------------解决方案--------------------------------------------------------
把EOF改成 '\r'
getchar() 的话好像会有缓冲
----------------解决方案--------------------------------------------------------
getchar()有缓冲`````是什么意思````

还有\N和\R好像都是换行的意思`那他们有什么区别吗```
----------------解决方案--------------------------------------------------------
缓冲就是输了以后不显示,回车了才显示*
   \r回车是将光标移到一行的前面, \n是移到下一行
----------------解决方案--------------------------------------------------------
我们通常按的回合不就是要把光标移到下一行吗?

那应该就是\N啊````
----------------解决方案--------------------------------------------------------
LZ的程序有两点要注意的。。。。。。。。。
1.你要把'\n' 换成 '\r' 。
  实际上,'\n'  只是一个换行符,'\r'才是一个回车符。而当我们按下(Enter)回车键时,它实际上是输入了两个字符,一个是回车符,一个换行符,即“\r\n”,也就是我们所说的“回车换行”,而我们用的“C=getch()” 一次只能接收一个字符,也就是只能接收"\r",后面的没办法去接收,所以得到的是回车符“\r”,所以LZ因为不能接收到换行符而陷入死循环。
2、对于退格键,我是这样理解的,它只是把写的位置(我们先用光标理解)前移一位,它是不能自动清除 字符, 所以我们要用输出空格来代替它,输出空格后,光标又下移一位了。。所以我们还得用一个退格符。。

LZ的程序我改造如下:

#include <stdio.h>
#include <conio.h>

int main(void)
{
    char c, s[50] = {'0'};  
    int i = 0 ;
   
    while ( ( c=getch() ) != '\r' && c != EOF && i<50 )
    {
          if ( c == '\b' )
          {
//            putchar(c) ;
              printf("\b \b");   
            if ( !i )
               continue ;
            else
               --i ;
          }
          else
          {        
            putchar('*') ;
            s[i++] = c ;
          }
    }
   
    s[i] = '\0' ; i = 0 ;      
    printf("\n%s\n",s);
    return 0 ;
}
----------------解决方案--------------------------------------------------------
谢谢LS的解答````你让我明白了许多````

关于第2点``我刚刚调试了10个程序```结果观察到的现象和你一样```
我唯一处理的和你不一样的是```退格后```我用的 ' \0 ' 来代替当前字符``
而不是用空格```

关于第1点```我有个小小的疑问``getch()``getchar()``都是读取单个字符吧
```那为什么 getchar()`` 读取的只是`` '  \n '
而getch()却只能读前一个字符呢?

[[italic] 本帖最后由 死了都要C 于 2007-12-14 15:02 编辑 [/italic]]
----------------解决方案--------------------------------------------------------
  相关解决方案