在c中打印bool结果为'false'或'true'的最佳方法?

Pis*_*gan 16 c printf boolean

我必须编写一个程序,其中main调用其他函数来测试一系列数字(如果有的话)是否小于一个数字,如果所有系列的数字都在两个限制之间,如果有的话是负数.我的代码返回值为1表示true,0表示false表示,但是赋值会将它们打印为"true"或"false".我不知道如何将bool答案从printf打印为字符串.我使用if(atl == false)printf("false"); 在我的at_least.c和main.c中,它只返回一个true或false的长字符串(例如: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;
 }
Run Code Online (Sandbox Code Playgroud)

我对一组数字的结果:

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
Run Code Online (Sandbox Code Playgroud)

这是在C中,我似乎找不到多少.

在此先感谢您的帮助!

附录:

从下面的答案重复这一点.

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

void between(int x, bool* bet) 
  { 
    if (x >= LOWER && x <= UPPER) 
        *bet = false; 
    return; 
  }
Run Code Online (Sandbox Code Playgroud)

作为我的代码.我不确定是什么问题.

R..*_*R.. 45

备用无分支版本:

"false\0true"+6*x
Run Code Online (Sandbox Code Playgroud)

  • 具有自记录名称的内联函数或宏(例如`bool2str`)可以解决这个问题. (17认同)
  • 虽然很难读.但不错的解决方案. (6认同)
  • 这实际上是做什么的?你能为我们这些学习c的人提供一些细节,他们偶然发现了这个答案吗? (5认同)
  • @ ArchaeaSoftware:我不知道你的意思是"不兼容Unicode".char字符串唯一可能的Unicode表示形式是UTF-8.但即使你确实有一个`wchar_t`字符串(`L`前缀),代码仍然有效,因为指针添加是根据数组元素而不是字节.您的评论表明缺乏对C语言的理解. (4认同)
  • @WilliamEverett:表达式`"false\0true"`实际上计算为指向程序内存中特定字符串的`const char*`.如果`x`是1(真),则`+ 6*x`为该指针加6;如果`x`为0(假)则为0.如果向指针添加0,则"printf"将在"f"处开始读取,并在到达"\ 0"(空终止字符)时停止读取.如果添加6,则'printf`将开始在't`'处读取,并在字符串自然终止时停止读取.但是,如果`x`不是0或1,那么构造将失败,所以如果你不能保证它是,那么你需要@R的修复. (4认同)
  • 可以对此进行优化以避免多路复用,而应使用shift(在大多数cpus /平台上仍然是相关的优化):`“ false \ 0 \ 0 \ 0true” + 8 * x` (4认同)
  • @JoshTheGeek:是的,我并不是故意将它逐字复制到一个宏.您需要进行一些更改,如正确的括号和将值折叠为0/1.`("false\0true"+6*!!(x))`可能是最干净的方式. (3认同)
  • 此代码已被混淆且不兼容 Unicode。对于我试图教育他们如何编写可维护代码的初级工程师来说,我会将其视为一种反模式。当然它不会通过代码审查。 (2认同)
  • 我对C语言的理解很好。我也理解维护程序员能够以最少的麻烦来理解代码含义的重要性。您的回答(令人惊讶的是获得了 13 票赞成)和评论表明您对软件工程缺乏了解。 (2认同)
  • 这真是太酷了。Clang给了我一个警告“警告:在字符串中添加'int'不会追加到字符串[-Wstring-plus-int]”。而不是使用二进制加号运算符,这可能会使某人误以为他们正在正确地执行带有隐式类型转换的字符串连接。将代码写为'&“ false \ 0true” [6 * x]`会使编译器感到安心。 (2认同)

Mit*_*eat 23

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

  (a > b) ? "True" : "False";
Run Code Online (Sandbox Code Playgroud)

或者在你的情况下:

  x ? "True" : "False" ;
Run Code Online (Sandbox Code Playgroud)


Osc*_*orz 15

x ? "true" : "false"

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

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

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

  • 从技术上讲,它是一个“ const char *”,而不是一个“ char *”(尽管从前者到后者的转换已被弃用),但这与这里无关。 (3认同)
  • 当内联函数可以完成这项工作时,创建宏就没有意义了。 (2认同)
  • 不,这是`char*`.这是C而不是C++. (2认同)