【问题标题】:C program loops indefinitelyC 程序无限循环
【发布时间】:2014-06-05 18:25:22
【问题描述】:

当我运行我的程序时,它会无限期地询问密码。我输入了正确的密码,但它只是循环回来。我在编译时没有错误。为了编译,我使用了:

gcc -ansi -W -Wall -pedantic -o prog myProgram.c
chmod +x prog

我正在运行 ubuntu 值得信赖。下面是密码相关的代码:

char string[100] = "";

int main(void)
{
    char correctPassword[25] = "myPassword";
    char password[25] = "";

    system("clear");

    printf("Enter your password:\n");
    scanf("%s", password);

    if (password == correctPassword)
    {
        system("clear");
        printf("Enter a string:\n");
        scanf("%s", string);
    }
    else
    {
        system("clear");
        printf("Sorry, incorrect password\n");
        system("pause");
        main();
    }

更新代码:

char string[100] = "";

int main(void)
{
    char correctPassword[25] = "myPassword";
    char password[25] = "";
    int ret;

    system("clear");

    printf("Enter your password:\n");
    scanf("%s", password);

    ret = strcmp(password, correctPassword);
    if (ret == 0)
    {
        system("clear");
        printf("Enter a string:\n");
        scanf("%s", string);
    }
    else
    {
        system("clear");
        printf("Sorry, incorrect password\n");
        system("pause");
        main();
    }
    return 0;
}

编辑 2:我认为现在无法解决,我该如何标记它?

【问题讨论】:

  • 用调试器单步调试,看看发生了什么。您拥有自己解决这一问题所需的几乎所有工具。如果你这样做了,你可能会问一个问题,比如“为什么 password == correctPassword 总是返回 false?”这是一个更好的问题。以你的方式递归调用 main 也很奇怪。
  • 不能使用==比较数组。
  • @mee:使用 while 循环。您是否尝试过阅读有关 C 的书?那将是一个很好的开始。
  • 我认为你决定尝试密码程序有点太早了。
  • 顺便说一句...不要在密码尝试失败时调用 main()。这会导致很多东西被压入堆栈,如果输入了正确的密码,并且程序控制权在其他地方被传递,当代码退出时,它必须展开所有这些。您编写上述代码的方式需要使用标签和 GOTO。但是,如果您询问 10 位不同的 C 程序员如何做到这一点,您可能会得到 10 种不同的答案。一切从 for() 循环,所以你在 x 次尝试后退出,到一个 while 循环,到一个 goto,到一个 do 循环......你必须喜欢 C 语言!

标签: c infinite-loop


【解决方案1】:

这一行

if (password == correctPassword)

不做你认为它做的事。它不是比较字符串,而是比较每个字符串的第一个字符的内存地址。如果你想比较字符串,你想使用 strcmp,你可以在这里阅读:http://www.tutorialspoint.com/ansi_c/c_strcmp.htm

EDIT 响应代码的变化;你有行

if(ret = 0)

你想要

if(ret == 0)

我假设这是一个错字。

【讨论】:

  • 我更新了我的代码以使用 strcmp(),但现在我收到 2 个警告。我应该将更新后的代码粘贴到哪里让您查看?
  • 继续编辑您的问题;我会相应地编辑我的答案
  • 这是 100% 正确的答案...如果您收到警告,它们是什么?请记住,某些 CRT 下的 strcmp() 已更改为 strcmp_s(),它允许您在字符串的 LENGTH 上设置绝对 MAX,以防止将整个 FILE 转储到您的小密码字段中并溢出堆栈的可能情况,导致你的程序被利用。
  • 哈!没错:) 它是一种类型。好的,请保持不良更新并再次检查。错过了那个
  • 好的,现在第一个 if 块可以工作了。如果我输入正确的密码,它会要求输入一个字符串。但是如果我输入了错误的密码,它只会再次循环,而不是告诉我我输入了错误的密码,然后返回
【解决方案2】:

在 scanf 语句中添加一个 & 符号。

scanf("%s", &password);

【讨论】:

  • 密码已经是一个字符*,所以添加符号实际上是错误的
猜你喜欢
  • 1970-01-01
  • 2023-03-29
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多