所以基本上我想创建一个程序,要求输入用户名和密码才能输入实际的程序。我尝试过这样的事情,但是当我输入第一个用户名和密码时,它并没有让我通过。另一方面,当我键入第二个用户名和密码时,它确实有效。有人能解释我为什么吗?
#include<stdio.h>
#include<string.h>
#define MAX 100
#define LEN 40
int names(char listName[][LEN]);
void pass(char listPass[][LEN]);
int main()
{
char name[LEN];
char password[LEN];
char listName[MAX][LEN];
char listPass[MAX][LEN];
int i;
names(listName);
pass(listPass);
printf("Enter username: ");
scanf("%s", name);
printf("Enter password: ");
scanf("%s", password);
for(i = 0; i< 2; i++)
{
if (strcmp(listName[i], name) == 0 && strcmp(listPass[i], password) == 0)
{
printf("Access granted\n");
break;
}
else
{
printf("Access denied\n");
break;
}
}
getch();
}
int names(char listName[][LEN])
{
int i;
strcpy(listName[i], "Vince");
strcpy(listName[i], "Jeremy");
}
void pass(char listPass[][LEN])
{
int i;
strcpy(listPass[i], "aBc2xyz8");
strcpy(listPass[i], "fa7saC12");
}
答案 0 :(得分:1)
在启用警告的情况下进行编译,您可以看到变量i
未使用在此处初始化:
int names(char listName[][LEN])
{
int i;
strcpy(listName[i], "Vince");
strcpy(listName[i], "Jeremy");
}
void pass(char listPass[][LEN])
{
int i;
strcpy(listPass[i], "aBc2xyz8");
strcpy(listPass[i], "fa7saC12");
}
您现在拥有的是未定义的行为,即任何事情都可能发生。你很可能会随机崩溃。
您的意思是strcpy(listName[0], "Vince");
,strcpy(listName[1], "Jeremy");
但是,您 想要做的是从main
中定义这些变量*,并在那里初始化它们。此外,通过使用指向char的指针数组,允许使用不同长度的密码和用户名。例如:
char *listName[MAX] = { "Vince", "Jeremy" };
char *listPass[MAX] = { "aBc2xyz8", "fa7saC12" };
int main(void) { ...
甚至更好,使用用户数据结构:
struct user_data {
char *username, *password;
};
struct user_data users[MAX] = {
{ "Vince", "aBc2xyz8" },
{ "Jeremy", "fa7saC12" }
};
答案 1 :(得分:1)
在names()和pass()中使用i未初始化,两个strcpy操作都将复制到同一个数组索引。
答案 2 :(得分:0)
以下代码不是您的意图:
int names(char listName[][LEN])
{
int i;
strcpy(listName[i], "Vince");
strcpy(listName[i], "Jeremy");
}
void pass(char listPass[][LEN])
{
int i;
strcpy(listPass[i], "aBc2xyz8");
strcpy(listPass[i], "fa7saC12");
}
您应该初始化i并在语句之间递增,或者只使用:
int names(char listName[][LEN])
{
strcpy(listName[0], "Vince");
strcpy(listName[1], "Jeremy");
}
void pass(char listPass[][LEN])
{
strcpy(listPass[0], "aBc2xyz8");
strcpy(listPass[1], "fa7saC12");
}