【问题标题】:Replace input with " * " C++用“*”替换输入 C++
【发布时间】:2011-09-13 16:33:36
【问题描述】:

我希望用户输入密码。当然这是一个秘密密码,所以没有人应该看到它。 所以我试图用'*'替换用户输入的字母和数字。这是我的尝试。

while ((pw=getch())!='x'){
cout << "*";
strcpy(pwstring,pw);

}

input_pw=atoi(pwstring.c_str());

稍后我希望“x”成为“输入”。但目前这并不重要。有了这个,我在 Visual Studio 下得到了一些编译器错误。

Fehler  3   
error C2664: 'strcpy': Konvertierung des Parameters 1 von 'char' in 'char *' nicht möglich  c:\users\tim\desktop\kalssnne\methoden.h    zeile: 70

我会试着翻译一下。

error 3
error C2664: 'strcpy': converting of parameter 1 from 'char' to 'char*' is not possible.



  official english error code
    "'function' : cannot convert parameter number from 'type1' to 'type2'" 

thank u:  R. Martinho Fernandes

但这意味着什么,我该如何解决?

希望你能帮助我

问候。

【问题讨论】:

  • 你的变量有哪些类型?声明在哪里?
  • 错误的official English text是:"'function' : cannot convert parameter number from 'type1' to 'type2'" 谢谢错误代码。
  • strcpy 并没有按照你的想法去做。
  • c++c 已经存在许多变体。如果一堆中没有完全相同的副本,我会感到惊讶。
  • @R. Martinho Fernandes 下次我会记得的;D

标签: c++ passwords


【解决方案1】:

您的问题与其说是关于 C++,不如说是关于如何与您的终端交互。该语言(故意)完全不知道如何处理输入和输出,而您所担心的一切都是终端的行为。因此,任何答案都将在很大程度上取决于您的平台和终端。

在 Linux 中,您可能需要查看 termios.hncurses.h。有一个旧的 Posix 函数 getpass(),它的功能与您想要的类似,但它已被弃用。

不幸的是,我不知道如何在 Windows 中进行终端编程。

【讨论】:

  • 奇怪的是,我可以找到几个声称 getpass 已过时的来源,但我找不到商定的替换。
  • @dmckee:我认为问题在于并发性和可重入性。要安全地读取密码,您必须将终端设置为原始模式,而在并发设置中这本身可能很棘手。我想如果你是单线程的,getpass() 应该没问题。
  • 这是一个很好的并发调用,如果多个执行线程可以访问终端,整个业务将很容易受到攻击。
【解决方案2】:

在 posix 系统上使用 getpass (3)

它不会给你 asterix 回声,而是什么都不回声,但它是这样做的方法。

或者,如果您使用的是 BSD 系统,则可以使用readpassphrase (3),它比旧调用更灵活。

【讨论】:

    【解决方案3】:

    正如 R. Martinho Fernandes 所说:strcpy doesn't do what you think it does.

    strcpy 采用char* 缓冲区和char* 源,并将所有数据从第二个(直到第一个零字符)复制到第一个。最简单的解决方案是跟踪 pwstring 的长度并一次添加一个字符:

    char pwstring[100];
    int length = 0;
    while ((pw=getch())!='x' && length < 99){
        cout << "*";
        pwstring[length] = pw;
        length = length + 1;
    }
    pwstring[length] = '\0';
    int pwint = atoi(pwstring);
    

    [编辑] 如果 pwstring 是一个 std::string,那么这变得非常容易,因为它已经跟踪了它自己的长度。

    std::string pwstring;
    while ((pw=getch())!='x'){
        cout << "*";
        pwstring += pw;
    }
    int pwint = atoi(pwstring.c_str());
    

    【讨论】:

    • 也许可行,但如上所示,我需要它作为一个 int 值。这就是我使用atoi的原因。如果你用 [100] 启动 pwstring,我的编译器会说 '.c_str()' must have class/struct/union.
    • 哦,哇,我从 strcpy() 的使用中假设 pwstring 是一个 char[?]。重新阅读您的原始错误,我发现它实际上是一个字符,这甚至不是您想要的。
    【解决方案4】:
    strcpy(pwstring,pw);
    

    我猜 pwstring 是一个 std::string? strcpy 是一个 c 函数,它作用于 'c' 以 null 结尾的字符串。您正在为它提供一个 c++ 字符串和一个 int。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 2012-06-19
      • 2022-01-21
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多