【问题标题】:How to display asterisks for password input only after two consecutive colons?如何仅在两个连续冒号后显示星号输入密码?
【发布时间】:2015-08-16 11:19:59
【问题描述】:

我想读取用户的输入。用户输入序列:: 后,输入的其余部分应为星号。

例如:假设用户输入:Alex::vn800。在屏幕上,输出应该是:Alex::*****

我有一个函数可以读取用户输入并在屏幕上显示*,但我没有设法在读取行的中间使用它。

我尝试操作函数getchar()scanf() 在检测到:: 序列后停止读取行,然后调用该函数但没有任何效果。

我能做什么?

更新:嘿!感谢您的回答。 我通过使用库 conio.h 勉强解决了这个问题 - 就像在任何其他简单的获取密码代码中一样,只是我根据我想要屏幕显示的内容对它进行了分解,而不仅仅是 '*' 用于任何情况。

【问题讨论】:

  • 哪个操作系统?你能用getch()吗?
  • Curses 库浮现在脑海中。请参阅en.wikipedia.org/wiki/Curses_%28programming_library%29 或 ncurses
  • 输入是否总是来自终端设备?
  • 这不是完全重复的。但正如man getpass 中所述,您必须操作终端设置:首先,一次读取输入一个字符,然后禁用回显。所有这些都假设 Unix;没有可移植的方式,您也没有指定平台。
  • 如果包含代码,特别是读取用户输入并在屏幕上显示*s 的函数,您将获得更好的响应。

标签: c input


【解决方案1】:

如果不是绝对需要在同一行中同时包含用户名和密码,我建议先获取用户名,然后使用getpass() 函数,例如here

我尝试了ataman 的方法,但它在 OSX 10.9 上不起作用。

这是一个修改后的版本,遵循goldPseudo 的方法:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int readChar;
    int status = 0;
    int semicolonCount = 0;

    system ("/bin/stty raw"); // disable buffering and other stuff
    while ((readChar = getchar()) && (readChar != 13 /* ENTER keycode */))
    {
        if (status == 0)
        {
            printf("%c", readChar);

            if (readChar == ':')
            {
                semicolonCount++;
            } else {
                semicolonCount = 0;
            }

            if (semicolonCount == 2)
            {
                status = 1;
            }
        } else {
            printf("*");
        }
    }
    printf("\r\n"); // print new line
    system ("/bin/stty cooked"); // reenable buffering, might not be the original mode the terminal was in

    return 0;
}

这种方法的问题在于,由于您处于“原始模式”,因此不会处理特殊字符,例如 BACKSPACE、ENTER、Ctrl+D 甚至 Ctrl+C。 您必须自己实现这些角色的行为。

【讨论】:

    猜你喜欢
    • 2012-08-09
    • 2014-11-17
    • 2021-12-03
    • 2016-06-18
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    相关资源
    最近更新 更多