请大家帮我分析一下``谢谢先```
我想实现的 就是 一般的 输入密码````我碰到了一个问题```当我输入几个密码``如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]]
----------------解决方案--------------------------------------------------------