【问题标题】:While iterating through an array, how to make sure that the correct output is printed?在遍历数组时,如何确保打印正确的输出?
【发布时间】: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 语言中,情况并非如此,越界访问索引将产生未定义的行为,并在此示例中将数组(当可访问时)解释为整数之后返回字节。

标签: c arrays iteration


【解决方案1】:

当您遍历选项时,还没有打印任何内容。如果您找到正确的值,请设置一个标志。然后根据标志的值打印文本。

int found = 0;
while (i<(sizeof(validPass)/sizeof(validPass[0])) {
    if (userPass == validPass[i]) {
        found = 1;
        break;
    }
    i++;
}

if (found) {
    printf("Access granted \n");
} else {
    printf("Access denied \n");
}

【讨论】:

  • 我会在你的 sn-p 中包含int i = 0;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 2023-01-14
  • 2013-07-21
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多