【问题标题】:Boolean in C ProgrammingC 编程中的布尔值
【发布时间】:2016-04-13 12:09:30
【问题描述】:

所以,不幸的是,我在尝试创建的程序中遇到了另一个问题。首先,我对 C 编程完全陌生,我正在尝试创建一个 Word Search

我有这段 C++ 代码,我正在尝试将其转换为 C:

#include <iostream>

using namespace std;

int main()
{
    char puzzle[5][5] = {
        'A', 'J', 'I', 'P', 'N',
        'Z', 'F', 'Q', 'S', 'N',
        'O', 'W', 'N', 'C', 'E',
        'G', 'L', 'S', 'X', 'W',
        'N', 'G', 'F', 'H', 'V',
    };
    char word[5] = "SNOW"; // The word we're searching for
    int i;
    int len; // The length of the word
    bool found; // Flag set to true if the word was found
    int startCol, startRow;
    int endCol, endRow;
    int row, col;

    found = false;

    i   = 0;
    len = 4;

    // Loop through each character in the puzzle
    for(row = 0; row < 5; row ++) {
        for(col = 0; col < 5; col ++) {
            // Does the character match the ith character of the word
            // we're looking for?
            if(puzzle[row][col] == word[i]) {
                if(i == 0) { // Is it the first character of the word?
                    startCol = col;
                    startRow = row;
                } else if(i == len - 1) { // Is it the last character of the
                                          // word?
                    endCol = col;
                    endRow = row;

                    found = true;
                }

                i ++;
            } else
                i = 0;
        }

        if(found) {
            // We found the word
            break;
        }
    }

    if(found) {
        cout << "The word " << word << " starts at (" << startCol << ", "
             << startRow << ") and ends at (" << endCol << ", " << endRow
             << ")" << endl;
    }

    return 0;
}

但是,我遇到了一个问题,因为我刚刚注意到 C 编程不支持布尔值。

我正在使用它,所以用户输入他正在搜索的单词(例如:boy),用户还输入长度(3),然后用户将输入第一个和最后一个字母的坐标这个词的。当用户输入以下内容时,我打算从上面的代码中获取坐标,然后将它们与用户输入的内容进行比较。如果它们不匹配,则用户猜错了,如果它们匹配,则用户猜对了。

我也尝试了 stdbool.h 库,但是由于找不到库,所以它不起作用。

除了stdbool.h 还有其他方法吗?我知道你使用 true = 1 , false = 0 但是我不知道如何在下面的代码中解释它。

提前致谢。

【问题讨论】:

  • 您可以使用值为truefalse 的枚举
  • 有什么理由要将C++ 代码转换为C
  • Using boolean values in C的可能重复
  • 使用 #define 创建 TRUE 和 FALSE。这样,您的代码中的用法将是正确的,除了确保您使用定义的值(例如,将 true 更改为 TRUE 并将 false 更改为 FALSE)之外,您无需检查和编辑代码
  • 您需要所有这些行来描述问题吗?问题最多可以简化为当前大小的 20%。

标签: c boolean stdbool


【解决方案1】:

你这么说

我也尝试了 stdbool.h 库,但是由于找不到该库,因此无法正常工作。

那么,我倾向于建议您找到并使用符合标准的 C99 或 C2011 编译器。至少,前者不应该太难拿在手上。要么肯定会提供标题,并且使用它可能是您最方便的前进方式。

由于您的代码仍然包含一些 C++ 主义(例如 coutusing 语句和 C++ 风格的 #include),我倾向于相信您正在使用 C++ 编译器进行编译。这是找不到 stdbool.h 标头的一个可能原因。如果要转换为 C,请务必使用 C 编译器构建代码。

【讨论】:

  • 我正在使用 Microsoft Visual C++ 2010 Express,因为讲师建议我使用它。代码在 C++ 中,因为我在网上找到了它,但是我将其更改为 C 并发现了布尔问题。目前我想我已经设法修复它。感谢您的回答。
  • @Takari,无论构建模式或选项如何,没有任何版本的 Microsoft Visual C++ 符合 C99 或 C11。微软一直不感兴趣。如果你真的想构建 C 代码,我不推荐 MSVC 作为你的开发平台。
  • @Takari:所以你的任务是编写一些代码并尝试使用快捷方式复制你找到的东西,而不是自己编写。现在您注意到这可能并不那么容易。无论如何 - 踢你的讲师,获得符合标准的编译器(例如 MinGW/gcc)并至少使用 C99(更好的 C11)。只有一个有效的 C 标准,那就是 C11(尽管 C99 也非常相似并且可以接受)。 MSVC 是垃圾(至少你使用的版本)。
  • @Olaf 我其实很喜欢编程,但我从未涉足它,因为我没有任何想成为程序员的愿望。我正在学习商业和信息技术,不幸的是我有一个关于 C 的作业,但我从来没有用 C 编程过。(我在考试、HTML 和 Visual Basics 中使用过 Java)我不想走捷径,我根本没有创造它的知识。
  • @Takari:通常情况下,如果你得到一个任务,你也会被强化完成它。如果没有,就会对您的学校/大学/其他机构的整体质量产生怀疑。一个很好的指标已经推荐使用 MSVC 进行 C 编程。不确定是否有更糟糕的标准桌面编译器仍在维护。所以我强烈建议:获取 gcc 并使用 stdbool.h。抱歉,我无法获得 IDE,我不使用 Windows for Work。
【解决方案2】:

只需改用int。否则,请创建自己的布尔类型:

enum { false, true };
typedef int bool;

如果要存储许多布尔值,请考虑

typedef char bool;

相反。请注意,两者都不是“真正的”布尔类型,因为它可以假定除 0 和 1 之外的其他值。使用 C 约定,即 0 表示虚假,而其他所有值都表示真实。

【讨论】:

  • @Takari 你知道enum(枚举)是什么吗?如果没有,请尝试在您的 C 教科书中查找。
  • 抱歉,这是一个非常糟糕的建议。 C 有一个原生的布尔类型,为什么不使用它呢?
  • int 的行为不同。尝试:_Bool b = 5; int i = 5; i == b; 使用您的方法和 C99。
  • @Olaf OP 特别指出stdbool.h(因此很可能_Bool)不可用。请在投票前阅读问题。
  • @FUZxxl:我做得很好。我也读了cmets。而且问题并未说明 OP 仅限于使用非标准 C。
【解决方案3】:

您可以使用int1 等于true0 等于false

但我在程序顶部的代码中使用了这个,两个常量使用TRUEFALSE 就好像它们是布尔值一样:

#define FALSE 0
#define TRUE  1

【讨论】:

  • 抱歉,这是一个非常糟糕的建议。 C 有一个原生的布尔类型,那么为什么不使用它呢?获取更新的(即
  • 在他的情况下,我认为这是最好的方法。对不起,如果它不是你最喜欢的。
【解决方案4】:

C99 有 &lt;stdbool.h&gt; 标头。

【讨论】:

  • OP 说stdbool.h 在他的平台上不可用。投反对票。
  • @FUZxxl,OP 这么说可能是红鲱鱼。这至少表明他的编译器不符合 C99,这是有道理的,因为他的代码依赖于 C++ 特定的特性。没有 C99 编译器会接受它。如果他真的打算转换为符合 C 的,那么他最终应该能够依赖stdbool.h
  • 赞成;这是唯一正确的答案。根据评论,OP 只使用不兼容的编译器 MSVC10,因为有人(对 C 标准知之甚少)推荐了它。所以 OP 可以使用不同的工具链。我在这里同意@JohnBollinger)。
  • @FUZxxl,是的,我确实读过这个问题。由于 OP 说他 尝试过 stdbool.h 并发现它对他不起作用,因此可以合理地得出结论,如果他不使用 stdbool.h,他在接受他的代码的编译器上进行了测试.对于他提供的代码,只能是C++编译器,因此他的测试是有缺陷的(实际上,他使用了MSVC++)。每个符合 C99 和 C11 的编译器都支持stdbool.h。 “使用符合标准的编译器并依赖标准 C 的特性”对于明确从事教育活动的人来说几乎是不恰当的建议。
  • @FUZxxl,在指责我对这个问题关注不够之前,也许你应该自己审查一下,以评估你对它的哪些声明实际上存在,哪些是你自己的推论。无论如何,我想我们将不得不就敦促 C 新手学习实际的标准 C 并使用支持它的开发平台是否有效的问题达成一致意见。就他自己而言,OP 似乎已经接受了这一点。
猜你喜欢
  • 1970-01-01
  • 2016-01-12
  • 2023-03-17
  • 2017-12-13
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
  • 1970-01-01
相关资源
最近更新 更多