C 我现在该怎么办?

C 我现在该怎么办?,c,authentication,printf,scanf,C,Authentication,Printf,Scanf,这可能真的很简单,但我真的不知道现在该做什么。 我最近刚开始编程,我想我应该从学习C开始,我知道一些东西,但我最近才遇到这个问题,我无法解决它 我正在尝试使用scanf()创建一个注册/登录系统,将凭证存储到字符串中,我真的不知道如何让登录部分工作。我是否需要创建更多字符串并将输入存储在那里?或者如何将用户的输入与字符串中的值进行比较 我的代码目前如下所示: #include<stdlib.h> #include<time.h> char user[30] = &quo

这可能真的很简单,但我真的不知道现在该做什么。 我最近刚开始编程,我想我应该从学习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");
}
#包括
#包括
字符用户[30]=“”;
字符密码[30]=“”;
char yn[30]=“”;
字符Y[1]=“Y”;
字符N[1]=“N”;
int main(){
printf(“寄存器”);
printf(“用户或密码不能超过30个字符\n”);
printf(“用户:\n”);
scanf(“%s”,用户(&U);
if(user==NULL)
printf(“用户不能为空\n”);
其他的
printf(“密码:\n”);
scanf(“%s”和密码);
如果(密码==NULL)
printf(“密码不能为空\n”);
printf(“用户另存为:\n”);
printf(“%s\n”,用户(&U);
printf(“密码另存为:\n”);
printf(“%s\n”和密码);
printf(“这是正确的吗?\n”);
printf(“是/否\N”);
scanf(“%s”,yn);
if(yn==Y){
printf(“\e[1;1H\e[2J”);
}
如果(yn==N){
printf(“重新启动…”);
}
printf(“登录名”);
printf(“用户:\n”);
}

这一切都很好(除了在请求登录之前我不知道如何清除控制台,这不起作用,
printf(“\e[1;1H\e[2J”);
),我甚至设法将用户的输入打印到控制台,以确保其正确,我做了一个(是/否)什么。有人能帮我吗?

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


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

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

例如,你知道你可以用
==
比较两个变量,但这会比较值,在某些情况下,你会像比较值一样比较引用。引用是内存地址,如果RAM中有两个字母
Y
,那么它们是不同的,有两个不同的引用,即使它们的值相同。

由于您的许多处理都使用字符串,因此当您在
#include
中阅读可用的函数时,您会听到很多关于其中一些函数如何不安全使用的信息;现在我建议跳过安全参数,因为在您知道如何调用函数后,它们更有意义

比如说

if (yn == Y) {
不会给你想要的结果,但是

if ( strcmp( toupper( yn[0] ), "Y" ) == 0 ) {
将为您提供所需的结果。与大多数情况一样,还有其他方法可以编写相同的逻辑;但是,对于那些希望提供更有效的检查
yn
方法的人来说,这是一个旨在展示字符串函数的示例

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

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

第一个解决方案是使用一个名为wchar的“宽字符”,它的类型为wchar\u t。这就像一个字符,但它包含16位。这就开始了整个“字符”与“wchar\u t”的问题。现在你可以忽略它们,但要知道,如果你使用wchar\u t,你需要wchar兼容的函数

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

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


祝你好运。

如果(user==NULL)
将永远不会为真,因为
user[]
是一个具有固定地址的数组。如果你试图检测空字符串,你不能用
scanf(“%s”,&user);
(应该是
scanf(“%29s”,user);
(无论如何都应该是
scanf(“%29s”,user);
)。清除控制台比人们想象的要复杂,因为这取决于控制台的特性。您正试图通过编写ANSI终端控件转义序列来完成此操作,但是(假设您获得了正确的序列)这只有在控制台接受ANSI序列时才起作用,而现在很多人不接受。清除控制台的低技术方法是打印足够多的空行,以滚动屏幕上以前的所有文本,但是(1)您需要知道控制台有多少行,或者至少有一个最大行数,以及(2)这使得光标位于屏幕底部而不是顶部。您无法将字符串与
if(yn==Y)
if(yn==N)
进行比较,并且这些测试都不会为真。这意味着控制台从未收到该清除屏幕序列。请使用
strcmp()
。其他