在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】:
替代无分支版本:
"false\0true"+6*x
【讨论】:
具有自记录名称的内联函数或宏(例如bool2str
)可以解决此问题。
这实际上是做什么的?您能否为我们这些学习 c 的人偶然发现这个答案提供一些细节?
@ArchaeaSoftware:我不知道您所说的“不兼容 Unicode”是什么意思。 char 字符串唯一可能的 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
【参考方案2】:
您可以使用 C 的条件(或三元)运算符:
(a > b) ? "True" : "False";
或者在你的情况下:
x ? "True" : "False" ;
【讨论】:
【参考方案3】:x ? "true" : "false"
上面的表达式返回一个char *
,因此你可以这样使用:
puts(x ? "true" : "false");
要么
printf(" ... %s ... ", x ? "true" : "false");
您可能想为此制作一个宏。
【讨论】:
从技术上讲,它是const char*
,而不是char*
(尽管从前者到后者的转换已被弃用),但这在这里无关紧要。
当内联函数可以完成这项工作时,创建宏是没有意义的。
不,是char *
。这是 C 而不是 C++。【参考方案4】:
那么这个呢:
#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
。【参考方案5】:
我为此准备了三个数组:
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 承认标准未使用的潜在保留标识符(尚未)保留。以上是关于在c中将布尔结果打印为“假”或“真”的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章