在c中将布尔结果打印为“假”或“真”的最佳方法?

Posted

技术标签:

【中文标题】在c中将布尔结果打印为“假”或“真”的最佳方法?【英文标题】:Best way to print the result of a bool as 'false' or 'true' in c? 【发布时间】:2011-11-28 20:52:31 【问题描述】:

我必须编写一个程序,其中 main 调用其他函数来测试一系列数字是否小于一个数字,如果所有系列的数字都在两个限制之间,并且如果有的话是负数。我的代码返回值 1 表示真,0 表示假,但作业要求将它们打印为“真”或“假”。我不确定如何从 printf 获取布尔答案以打印为字符串。我用 if (atl == false) printf("false");在我的 at_least.c 和 main.c 中,但它只返回一长串真或假(例如:truetruetrue ....)。我不确定这是否是正确的编码,我把它放在了错误的位置,或者我需要使用其他一些代码。

这是我的 main.c:

#include "my.h"

int main (void)


    int     x;
    int     count    = 0;
    int     sum      = 0;
    double  average  = 0.0;
    int     largest  = INT_MIN;
    int     smallest = INT_MAX;
    bool    atlst    = false;
    bool    bet      = true;
    bool    neg      = false;
    int     end;

    while ((end = scanf("%d",&x)) != EOF)
        
            sumall(x, &sum);                           //calling function sumall
            count++;
            larger_smaller(x, &largest, &smallest);    //calling function larger_smaller
            if (atlst == false)
               at_least(x, &atlst);                    //calling function at_least if x < 50
            if (bet == true)
               between(x, &bet);                       //calling function between if x is between 30 and 40 (inclusive)
            if (neg == false)
               negative(x, &neg);                      //calling function negative if x < 0
        
    average = (double) sum / count;         
    print(count, sum, average, largest, smallest, atlst, bet, neg);
    return;
 

我的一组数字的结果:

The number of integers is:           15
The sum is               :         3844
The average is           :       256.27
The largest is           :          987
The smallest is          :          -28
At least one is <  50    :            1     //This needs to be true
All between  30 and  40  :            0     //This needs to be false
At least one is negative :            1     //This needs to be true

这是用 C 语言编写的,我似乎找不到太多关于它的内容。

提前感谢您的帮助!

附录:

这是从下面的答案中重复的。

这适用于 at_least 和negative 函数,但不适用于 between 函数。我有

void between(int x, bool* bet) 
   
    if (x >= LOWER && x <= UPPER) 
        *bet = false; 
    return; 
  

作为我的代码。我不确定出了什么问题。

【问题讨论】:

顺便说一句,x == true 在布尔表达式中是多余的;你可以说x。同样,x == false 就是 !x What is the printf format specifier for bool?的可能重复 【参考方案1】:

我为此准备了三个数组:

strbool.c

#include "strbool.h"

const char alx_strbool[2][6]    = "false", "true";
const char alx_strBool[2][6]    = "False", "True";
const char alx_strBOOL[2][6]    = "FALSE", "TRUE";

strbool.h

#pragma once

/* rename without alx_ prefix */
#if defined(ALX_NO_PREFIX)
#define strbool     alx_strbool
#define strBool     alx_strBool
#define strBOOL     alx_strBOOL
#endif

extern  const char alx_strbool[2][6];
extern  const char alx_strBool[2][6];
extern  const char alx_strBOOL[2][6];

免责声明:前缀是必需的,因为以str 开头的名称是reserved(实际上只有strbool),但在它们真正被C 或POSIX 使用之前,我将使用短版本。

使用起来非常简单:

#include <stdio.h>

#define ALX_NO_PREFIX
#include "strbool.h"

int main(void)

        int var = 7;

        printf("var is %s\n", strBool[!!var]);

        return 0;

var is True

【讨论】:

转换为 bool 似乎有点不可能并且使用起来不切实际。也许以这种方式定义 strbool 会使其更自然? #define strbool(x) alx_strbool[!!(x)] @Sho 是的,这可能是一个选项。如果一个函数看起来更自然地使用,我会编写一个inline 函数并接受一个bool 参数而不是类似函数的宏;那将是最易读/最直观的事情。无论如何,只要记住标识符strbool() 可能被标准保留。请注意,我说的是潜在保留,而不是保留,因为 C2x 承认标准未使用的潜在保留标识符(尚未)保留。【参考方案2】:

那么这个呢:

#include <stdio.h>

#define BOOL_FMT(bool_expr) "%s=%s\n", #bool_expr, (bool_expr) ? "true" : "false"

int main(int iArgC, char ** ppszArgV)

    int x = 0;
    printf(BOOL_FMT(x));

    int y = 1;
    printf(BOOL_FMT(y));

    return 0;

这会打印出以下内容:

x=false
y=true

将它与 bool 类型一起使用,但 int 应该以相同的方式工作。

【讨论】:

您可能希望将printf 调用添加到宏中。尽管由于逗号运算符的工作方式,您可以使用额外的括号来执行诸如puts((BOOL_FMT(1))) 之类的操作来打印true【参考方案3】:

替代无分支版本:

"false\0true"+6*x

【讨论】:

具有自记录名称的内联函数或宏(例如bool2str)可以解决此问题。 这实际上是做什么的?您能否为我们这些学习 c 并偶然发现此答案的人提供一些细节? @ArchaeaSoftware:我不知道您所说的“不兼容 Unicode”是什么意思。字符字符串唯一可能的 Unicode 表示是 UTF-8。但即使你确实有一个wchar_t 字符串(L 前缀),代码仍然有效,因为指针添加是根据数组元素,而不是字节。您的评论表明缺乏对 C 语言的理解。 @WilliamEverett:表达式"false\0true" 实际上计算为const char* 指向程序内存中的特定字符串。如果x 为1(真),+6*x 为该指针添加6,如果x 为0(假),则为0。如果将 0 添加到指针,printf 将在“f”处开始读取,并在到达“\0”(空终止字符)时停止读取。如果改为添加 6,printf 将在 't' 处开始读取,并在字符串自然终止时停止读取。但是,如果 x 不是 0 或 1,构造将失败,因此如果您不能保证它是,则需要 @R 的修复。 这可以优化以避免 mul 并使用 shift 代替(这在大多数 cpu/平台上仍然是一个相关的优化):"false\0\0\0true"+8*x【参考方案4】:

x ? "true" : "false"

上面的表达式返回一个char *,因此你可以这样使用:

puts(x ? "true" : "false"); 要么 printf(" ... %s ... ", x ? "true" : "false");

你可能想为此制作一个宏。

【讨论】:

从技术上讲,它是const char*,而不是char*(尽管从前者到后者的转换已被弃用),但这在这里无关紧要。 当内联函数可以完成这项工作时,创建宏是没有意义的。 不,是char *。这是 C 而不是 C++。【参考方案5】:

您可以使用 C 的条件(或三元)运算符:

  (a > b) ? "True" : "False";

或者在你的情况下:

  x ? "True" : "False" ;

【讨论】:

以上是关于在c中将布尔结果打印为“假”或“真”的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

在 postgresql 查询中检查布尔真/假结果

在 Firebase 远程配置中定义布尔变量的最佳方法是啥

R语言比较运算符和逻辑运算符顺序

在java中将布尔对象转换为字符串的最佳方法

Ruby:如何将字符串转换为布尔值

存储过程返回为 IF 条件布尔表达式