【发布时间】:2020-02-15 22:44:15
【问题描述】:
我正在制作一个简单的 C 程序,它接受用户输入并检查它是否是来自数组的有效密码。我发现如果它是数组中的最后一个密码(如果有 7 个有效密码)并且我正在使用 if 语句遍历数组中的每个元素以检查有效性,它会打印“拒绝访问”直到达到了正确的密码,因为它不是前几个允许的密码之一。
这是我所拥有的:
int userPass = 1971;
int validPass [] = {1912, 1914, 1922, 1947, 1958, 1964, 1971};
int i = 0;
while (validPass[i])
{
if (userPass == validPass[i])
{
printf("Access granted \n");
}
else
{
printf("Access denied \n");
}
i++;
}
这打印了 6 次“拒绝访问”,然后第 7 次打印了“授予访问权限”,因为根据数组中的第 7 个元素,用户密码是正确的。如何在授予或拒绝打印访问之前检查每个元素的有效性,以确保即使它是数组中的最后一个元素,也会打印正确的行?我尝试将我的 i++ 移动到 else 语句之前和 if 语句中,但程序不喜欢这样。
【问题讨论】:
-
您的
while行没有很好的停止方式——一旦您浏览了所有validPass条目(#0-6),i将是7,并且程序将继续进行。目前尚不清楚该程序在有效密码 1971 之后会找到什么,但该程序不会停止,直到它在 1971 年之后的某个地方运行到 0。这可能会或可能不会发生,为了您的目的,您可以假设这些数字是本质上是随机的。如果其中一个随机数与userPass匹配,会发生什么情况?您将获得“已授予访问权限”,这可能不是您所期望的。 -
请注意,您的代码使用未定义的行为来终止 while 子句。我猜你来自 JavaScript 或其他背景,访问越界索引将返回
undefined。然而,在 C 语言中,情况并非如此,越界访问索引将产生未定义的行为,并在此示例中将数组(当可访问时)解释为整数之后返回字节。