【问题标题】:What do I do now?现在我该怎么做?
【发布时间】:2020-10-24 12:55:50
【问题描述】:

这可能真的很简单,但我现在真的不知道该怎么做。 我最近刚开始编程,我想我应该从学习 C 开始,我知道一些东西,但我最近才遇到这个问题,我想不通。

我正在尝试创建一个使用 scanf() 将凭据存储到字符串中的注册/登录系统,但我真的不知道如何让登录部分正常工作。我是否需要创建更多字符串并将输入存储在那里?或者如何将用户的输入与字符串中的值进行比较?

我的代码目前看起来像这样:

#include<stdlib.h>
#include<time.h>

char user[30] = "";
char password[30] = "";
char yn[30] = "";
char Y[1] = "Y";
char N[1] = "N";
int main() {
printf("Register\n");
printf("The User or Password can't be longer than 30 characters\n");
printf("User: \n");
    scanf("%s", &user);
    if (user == NULL)
  printf("User can't be empty\n");
    else
    printf("Password: \n");
    scanf(" %s", &password);
    if (password == NULL)
  printf("Password can't be empty\n");
printf("User saved as: \n");
printf("%s\n", &user);
printf("Password saved as: \n");
printf("%s\n", &password);
printf("Is this correct?\n");
printf("Y/N\n");
scanf("%s", yn);
    if(yn == Y){
        printf("\e[1;1H\e[2J");
    }
    if(yn == N){
        printf("Restarting...");

    }
    printf("Login\n");
    printf("User: \n");
}

一切正常(除了我不知道如何在要求登录之前清除控制台,这不会工作printf("\e[1;1H\e[2J");),我什至设法将用户的输入打印到控制台供他制作确定它是正确的,我做了一个(Y/N)的东西。有人可以帮帮我吗?

【问题讨论】:

  • if (user == NULL) 永远不会为真,因为user[] 是一个具有固定地址的数组。如果您尝试检测空字符串;你不能用scanf("%s", &amp;user);输入一个空字符串(无论如何应该是scanf("%29s", user);)。
  • 清除控制台比人们想象的要棘手,因为它取决于控制台的特性。您正试图通过编写一个 ANSI 终端控制转义序列来做到这一点,但是(假设您有正确的序列)只有在控制台接受 ANSI 序列时才有效,而如今,许多人不接受。
  • 清除控制台的低技术方法是打印足够的空白行以将所有先前的文本滚动到屏幕外,但是(1)您需要知道控制台有多少行,或者至少最大值,以及 (2) 将光标留在屏幕底部而不是顶部。
  • 您不能将字符串与if(yn == Y) 或if(yn == N) 进行比较,而且这些测试都不会是真的。这意味着控制台从未收到过清屏序列。请使用strcmp()。
  • 其他清除控制台的方法可能不是您应该关注的(在)经验水平。

标签: c authentication printf scanf


【解决方案1】:

您可以创建函数而不是将它们全部放在主函数中。 创建一个保存数据的注册函数和一个请求数据作为参数并在 main 中调用的登录函数。

也许你可以创建一个简单的菜单。

【讨论】:

    【解决方案2】:

    当您第一次学习一门语言时,您会发现它的某些使用模式。您的一些问题来自于过度使用没有意义的模式。

    例如,您知道您可以将两个变量与== 进行比较,但它会比较值,并且在某些情况下,您会将引用作为值进行比较。引用是内存地址,如果您在 RAM 中有两个字母 Y,那么它们是不同的,有两个不同的引用,即使它们的值相同。

    由于您的很多处理都使用字符串,请仔细阅读#include &lt;string.h&gt; 时可用的函数,您会听到很多关于其中一些使用不安全的信息;现在我建议跳过安全参数,因为在你知道如何调用函数之后它们更有意义。

    例如

    if (yn == Y) {
    

    不会给你想要的结果,但是

    if ( strcmp( toupper( yn[0] ), "Y" ) == 0 ) {
    

    会给你想要的结果。在大多数情况下,还有其他方法可以编写相同的逻辑;但是,对于那些想要提供更有效的检查yn 方法的人来说,这是一个旨在展示字符串函数的示例。

    C 中的字符串不是单一值。它们是一段内存的地址(有时称为引用),如果您继续逐字符阅读,最终应该以 NULL 字符结尾,这是一个包含数字 0 的字符。这意味着它们无法比较直接就像在yn == Y 中一样,因为您正在比较两个内存地址,而不是两个字符序列。

    上面的例子是对字符串的简化。对于初学者来说,这是一个足够好的定义;但是,随着时间的推移,你会发现这个定义已经很老了,并且随着时间的推移已经被修改了。问题是char 只能保存 8 位,因此当需要超过 256 个不同的值时,会创建一个解决方案来保存更多值。

    第一个解决方案是使用称为 wchar 的“宽字符”,其类型为 wchar_t。这就像一个字符,但它包含 16 位。这开始了整个“char”与“wchar_t”的问题。现在您可以忽略它们,但请注意,如果您曾经使用 wchar_t,则需要与 wchar 兼容的函数。

    第二种解决方案是引入 Unicode,它提供了足够的字符,几乎所有语言都可以在 Unicode 中编写,甚至是大多数死语言、表情符号、颠倒文本等。Unicode 没有单一的方式来表示其字符,但是对于初学者来说有两个流行的。每个字符使用 32 个字节的 UTF-32 很受欢迎,因为它易于编程。 UTF-8 之所以流行,是因为它扩展了 ASCII 并成为 Internet 的格式,是 Internet 的有效“正确选择”。

    熟悉字符串后,您可能想花一些时间使用 UTF-8。

    祝你好运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-16
      • 2012-05-26
      • 1970-01-01
      • 2014-01-23
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多