| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 989 人关注过本帖
标题:请大家帮我分析一下``谢谢先```
只看楼主 加入收藏
死了都要C
Rank: 4
来 自:四川成都
等 级:贵宾
威 望:13
帖 子:1582
专家分:116
注 册:2006-12-7
结帖率:66.67%
收藏
 问题点数:0 回复次数:7 
请大家帮我分析一下``谢谢先```
我想实现的 就是  一般的 输入密码````

我碰到了一个问题```当我输入几个密码``如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]]
搜索更多相关主题的帖子: include 输入密码 
2007-12-14 06:29
死了都要C
Rank: 4
来 自:四川成都
等 级:贵宾
威 望:13
帖 子:1582
专家分:116
注 册:2006-12-7
收藏
得分:0 
我又单独试了下' \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`````
我郁闷了`````谁帮帮我啊````````````

女施主``我给你``送茶来了```师太``你就从了老衲吧``
代码本天成~~~妙头偶得之```
2007-12-14 07:04
jingru
Rank: 1
等 级:新手上路
帖 子:50
专家分:0
注 册:2006-11-16
收藏
得分:0 
把EOF改成 '\r'
getchar() 的话好像会有缓冲
2007-12-14 07:24
死了都要C
Rank: 4
来 自:四川成都
等 级:贵宾
威 望:13
帖 子:1582
专家分:116
注 册:2006-12-7
收藏
得分:0 
getchar()有缓冲`````是什么意思````

还有\N和\R好像都是换行的意思`那他们有什么区别吗```

女施主``我给你``送茶来了```师太``你就从了老衲吧``
代码本天成~~~妙头偶得之```
2007-12-14 07:26
jingru
Rank: 1
等 级:新手上路
帖 子:50
专家分:0
注 册:2006-11-16
收藏
得分:0 
缓冲就是输了以后不显示,回车了才显示*
   \r回车是将光标移到一行的前面, \n是移到下一行
2007-12-14 07:43
死了都要C
Rank: 4
来 自:四川成都
等 级:贵宾
威 望:13
帖 子:1582
专家分:116
注 册:2006-12-7
收藏
得分:0 
我们通常按的回合不就是要把光标移到下一行吗?

那应该就是\N啊````

女施主``我给你``送茶来了```师太``你就从了老衲吧``
代码本天成~~~妙头偶得之```
2007-12-14 13:17
布拉莫斯
Rank: 1
来 自:中国太平洋舰队
等 级:新手上路
帖 子:169
专家分:0
注 册:2007-3-31
收藏
得分:0 
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 ;
}

真理往往掌握在少数人手中,可现实却是少数服从多数!
2007-12-14 14:32
死了都要C
Rank: 4
来 自:四川成都
等 级:贵宾
威 望:13
帖 子:1582
专家分:116
注 册:2006-12-7
收藏
得分:0 
谢谢LS的解答````你让我明白了许多````

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

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

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

女施主``我给你``送茶来了```师太``你就从了老衲吧``
代码本天成~~~妙头偶得之```
2007-12-14 14:57
快速回复:请大家帮我分析一下``谢谢先```
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020525 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved