首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

新手问个C中用户输入的有关问题

2013-07-29 
新手问个C中用户输入的问题刚学C不到三个月,问一下各位大神一些控制台用户输入的问题。现在搞一个简单文件

新手问个C中用户输入的问题
刚学C不到三个月,问一下各位大神一些控制台用户输入的问题。
现在搞一个简单文件加密的程序,想实现两个效果:
1.文件加密前,要输入密钥,但是用scanf的话,会直接显示在屏幕上,我现在换用getch,然后再用putchar('*')输出星号,这样密钥不会直接显示出来,而用户也知道输入了多少个字符,但有个问题,如果用户按退格想删除前面一个字符,就不好办了,问题主要是显示的星号无法删除,如果我输入一个\b,那么仅仅是光标回去了,并不会删除前面那个星号,当然我接收密钥的字符数组中要删除前面那个字符还是没有问题,这在功能上没有大碍,但是总觉得显示效果上不太好,用户可能并不知道是否删没删,所以想问一下怎么实现scanf那种效果,但是输入的字符不回显的,而是输出星号或别的字符的?

2.加密要输入源文件盒目标文件,当用户输了源文件后,我想用户再输入目标文件时,默认目录就是源文件的目录,比如源文件是D:\file\1.rar,然后要用户输目标文件时,默认就是D:\file\,接下来要用户补全,但是,如果用户不想放在同一个目录里面的话,要能修改这个默认目录,由于第一个问题无法解决,所以这个问题也没解决。

我搜了一下,发现有些人说putchar或者其他方法输出到屏幕上的字符就不能删掉了,真的这样吗。。 C 输入输出
[解决办法]
1.的确是程序输出到屏幕上的字符就不能删掉了,估计只能重新描画窗口。。
  那就不输出*,Linux就是这样的。

2.把用户输入的路径存到一个字符串中,然后处理一下,遇到\就变成\\就行了,
然后将这个路径strcat 1.rar,打开这个路径,看文件是否存在.
[解决办法]
1.首先你必须确认你收到的是\b
然后用' '覆盖'*',再'\b'


if((c = getch()) == '\b')
 printf(" \b");


2.先把字符串后面的截掉,具体怎么做如下所示

int i, j = -1;
for (i = 0; i < strlen(srcdir); i++)
 if (srcdir[i] == '\\') j = i;
if (j == -1 
[解决办法]
 i - 1 == j) 提示不合法;
strncpy(srcpath, srcdir, j);

至于删不掉那个问题可以这么解决:
[code=c]
char ch;
int jj = j;
scanf("%c", &ch);
if (ch != '\n')
 if (ch == '\b') {
  srcpath[--j] = '\0';
  printf("\r%s", srcpath);                // '\r':使光标回到开头的位置
  for (i = j; i < jj; i++) putchar(' ');
  for (i = j; i < jj; i++) putchar('\b');
 } else 处理destpath;
else 加密;
[解决办法]
还可以用 \r 重新输出整行. 当然行输出的行要比上一次输出的长或相等, 不足的补空格.
------解决方案--------------------


引用:
感谢ghj123h提供的思路,现在用空格变相地“删除”字符,
各位觉得下面代码怎么样?有木有不当之处?

void inputPassword(unsigned char *password,unsigned char *size)
{
unsigned char ch;
unsigned char chc = 0;
    
    while ((ch = getch()) != 0x0D)//Enter
    {
if (ch == 0x08)//Backspace
{
if (chc)//If not empty
{
chc--;
printf("\b \b");
}
continue;
}
if (chc < 16)//Password max length
{
password[chc++] = ch;
putchar('*');
}
}
*size = chc;
}

没什么不妥
但是那个continue可能会使代码变得混乱

热点排行