【问题标题】:Control flow with while loops and if statements使用 while 循环和 if 语句控制流
【发布时间】:2023-04-09 07:57:01
【问题描述】:

我无法理解我的一段代码中的控制流。编写代码以获取起始词(即 cat)和结束词(即 dog)一次更改原始单词的 1 个字母并到达结束词 - 检查真实单词的字典。如果到达一个非真实的单词,即cat --> dat,它应该跳出循环并尝试更改一个不同的字母。

while (strcmp (startword, endword) != FALSE)
    {      
    change_letter(startword, endword, i++);
    if ((check_dictionary(dictionary, startword)) == FALSE)
        {
            printf("%s --> ", startword);
            printf("Bad route\n");
            break;
        }
   if ((check_dictionary(dictionary, startword)) == TRUE)
        {
        printf("%s --> ", startword);
        }
    }

change_letter 只会做startword[i] = endword[i],其中 i 被初始化为 0(对于第一个字母,并在 i++ 出现时移动字母。

检查字典将单词与字典进行比较,如果找到该单词,则返回 1。 (#define TRUE = 1,#define FALSE = 0)。

现在它将打印(如果使用cat and dog 作为单词) cat --> dat --> Bad route 仅此而已。

据我了解,当两个词不相等时,它不应该离开顶部的 while 循环。

【问题讨论】:

  • 学习使用调试器
  • 确保 startword 和 endword 为空终止字符串
  • 我正在使用添加空终止符的 scanf
  • @squeamishossifrage 确实如此,但我认为 OP 将它们用作宏。

标签: c if-statement while-loop


【解决方案1】:
while (strcmp (startword, endword))
{      
    change_letter(startword, endword, i++);
    if (!check_dictionary(dictionary, startword))
    {
        printf("%s --> ", startword);
        printf("Bad route\n");
    }
    else (check_dictionary(dictionary, startword))
    {
        printf("%s --> ", startword);
    }
}

稍微修改了您的代码。删除了 break,因为它会中断循环中的控制流,并且控制位于循环 } 之后的下一条语句上。那是你的问题。不过,不确定它现在是否有效,因为它取决于您的 check_dictionary 实现。

另外,比较== TRUE是没用的。你可以无休止地写check_dictionary(dictionary, startword) == TRUE == TRUE == TRUE == TRUE,意思都是一样的。与while循环相同。它使您的代码难以理解,通常是一种不好的做法。

毕竟,我删除了第二个函数调用,使函数返回值只被评估一次。

此外,请尝试通过保持相同的编码风格(大括号!)来控制代码的可读性。它提高了代码的可读性。

抱歉,无聊。

【讨论】:

    猜你喜欢
    • 2013-06-09
    • 2016-01-12
    • 2012-06-18
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 2014-01-21
    相关资源
    最近更新 更多