c - 基本用户名/密码代码在 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;
}
解决方案
您已定义int N;
但未初始化它。因为它在全局范围内,所以它的值是 0。
当您到达该行时LoginInfo code[N];
, 的值N
仍为 0,因此数组的大小为 0。访问数组的任何元素都会导致未定义的行为,并且可能是错误的根源。
在使用它之前,您需要对其进行初始化N
或以其他方式赋予它一个合理的值。例如:
int N = 5; // Initialize this!
通过此更改,您的代码可以干净地编译并运行。编译器资源管理器演示
推荐阅读
- vb.net - VS 2017 设计时错误
- python - 解压这个嵌套字典的更好方法?
- c# - 下拉列表默认项 c# asp.net
- python - 如何以有效的方式将具有 MultiIndex 的数据帧合并到另一个数据帧中?
- php - 使用 Guzzle 将 Body 发送为原始数据
- python - CNN 训练准确率随着 BatchNorm 停滞不前,快速过拟合
- ios - Metal中的核函数
- ios - UISearchController:昏暗的覆盖覆盖搜索栏本身
- python - 将值从 python 类对象附加到 Python 中的另一个类对象
- c# - 使用相对路径从共享布局调用 mvc razor 视图中的函数,即 _layout.cshtml