首页 > 解决方案 > 基本用户名/密码代码在 C 中不起作用 - 分段错误

问题描述

两天前我刚刚开始学习 C,并尝试编写一个代码,提示用户提交用户名和密码,然后将输入与存储的数据交叉引用。这个想法是,如果输入的用户名和密码匹配,则打印“Access Granted”,如果不匹配,则打印“Access Denied”。

但是,每当我使用输入测试代码时,我都会不断收到“拒绝访问。分段错误”。关于为什么会发生这种情况的任何想法?在下面附上我的代码以供参考:

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <cs50.h>

int N;

typedef struct
{
    string Username;
    string Password;
}
LoginInfo;

int main(void)
{
    LoginInfo code[N];

    code[0].Username = "Agent X";
    code[0].Password = "1314XN";

    code[1].Username = "Agent Y";
    code[1].Password = "1315YN";

    code[2].Username = "Agent Z";
    code[2].Password = "1316ZN";

    code[3].Username = "Director A";
    code[3].Password = "1414AN";

    code[4].Username = "VP A";
    code[4].Password = "1628VPN";

    string User = get_string("Username: ");
    string Pass = get_string("Password: ");

    for (int i = 0; i < N; i++)
    {
        if((strcmp(code[i].Username, User) == 0) && (strcmp(code[i].Password, Pass) == 0))
        {
            printf("Access Granted.\n");
            return 0;
        }
    }
    printf("Access Denied.");
    return 1;
}

标签: ccs50

解决方案


您已定义int N;但未初始化它。因为它在全局范围内,所以它的值是 0。

当您到达该行时LoginInfo code[N];, 的值N仍为 0,因此数组的大小为 0。访问数组的任何元素都会导致未定义的行为,并且可能是错误的根源。

在使用它之前,您需要对其进行初始化N或以其他方式赋予它一个合理的值。例如:

int N = 5; // Initialize this!

通过此更改,您的代码可以干净地编译并运行。编译器资源管理器演示


推荐阅读