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

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

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

我搜了一下,发现有些人说putchar或者其他方法输出到屏幕上的字符就不能删掉了,真的这样吗。。
...全文
191 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
正在无聊中 2013-07-15
  • 打赏
  • 举报
回复
引用 7 楼 vnvlyp 的回复:
感谢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可能会使代码变得混乱
www_adintr_com 2013-07-13
  • 打赏
  • 举报
回复
还可以用 \r 重新输出整行. 当然行输出的行要比上一次输出的长或相等, 不足的补空格.
vnvlyp 2013-07-13
  • 打赏
  • 举报
回复
感谢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;
}
正在无聊中 2013-07-13
  • 打赏
  • 举报
回复
引用 5 楼 ghj123h 的回复:
[quote=引用 4 楼 ghj123h 的回复:] 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);
至于删不掉那个问题可以这么解决:

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 加密;
[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 加密;[/quote] [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 加密;
正在无聊中 2013-07-13
  • 打赏
  • 举报
回复
引用 4 楼 ghj123h 的回复:
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 加密;
[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 加密;
正在无聊中 2013-07-13
  • 打赏
  • 举报
回复
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 加密;
vnvlyp 2013-07-13
  • 打赏
  • 举报
回复
引用 1 楼 lgbxyz 的回复:
1.的确是程序输出到屏幕上的字符就不能删掉了,估计只能重新描画窗口。。 那就不输出*,Linux就是这样的。 2.把用户输入的路径存到一个字符串中,然后处理一下,遇到\就变成\\就行了, 然后将这个路径strcat 1.rar,打开这个路径,看文件是否存在.
1.就是因为Linux那样的处理感觉不踏实,有时候不知道输没输。 2.不太明白你的意思,可能我也没说清楚。 我的意思是相当于文本框里的默认输入。 相关代码如下

printf("Source: ");
scanf("%s", srcfilename);
printf("Destination: ");
getdir(srcfilename,srcdir);//此函数得到源文件的目录
printf("%s", srcdir);//然后将此目录作为输出文件的默认目录
scanf("%s", desfilename);
//然后我可以把srcdir和desfilename合在一起作为输出文件的路径
//但问题是这样用户就不能修改目录了,即没办法删除printf("%s", srcdir)打出来的目录
LubinLew 2013-07-13
  • 打赏
  • 举报
回复
1.的确是程序输出到屏幕上的字符就不能删掉了,估计只能重新描画窗口。。 那就不输出*,Linux就是这样的。 2.把用户输入的路径存到一个字符串中,然后处理一下,遇到\就变成\\就行了, 然后将这个路径strcat 1.rar,打开这个路径,看文件是否存在.

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧