c语⾔输出bool,关于printf:在c中打印bool结果
为’false’或’true’。。。
我必须编写⼀个程序,其中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;
printf怎么输出字符
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。
可能重复什么是bool的printf格式说明符?
备⽤⽆分⽀版本:
"false\0true"+6*x
虽然很难读。但不错的解决⽅案。
具有⾃记录名称(例如bool2str)的内联函数或宏将解决该问题。
确实如此。 :)
很抱歉再次提出这个古⽼的问题,但我想我会说我喜欢这个解决⽅案,但是宏不会⼯作,除⾮x被转换为⼀个只能是1或0的BOOL。这个带我⼀分钟搞清楚。
@JoshTheGeek:是的,我并不是故意将它逐字复制到⼀个宏。您需要进⾏⼀些更改,如正确的括号和将值折叠为0/1。
("false\0true"+6*!!(x))可能是最⼲净的⽅式。
这实际上是做什么的?你能为我们这些学习c的⼈提供⼀些细节吗,他们偶然发现了这个答案吗?
此代码经过混淆,不兼容Unicode。对于我正在尝试教授如何编写可维护代码的初级⼯程师,我会把它作为反模式。当然它不会通过代码审查。
@ ArchaeaSoftware:我不知道你的意思是"不兼容Unicode"。 char字符串唯⼀可能的Unicode表⽰形式是UTF-8。但即使你确实有⼀个wchar_t字符串(L前缀),代码仍然有效,因为指针添加是根据数组元素⽽不是字节。您的评论表明缺乏对C语⾔的理解。
我理解C语⾔就好了。我也理解维护程序员能够以最少的头脑划痕来理解代码的含义的重要性。你的答案(令⼈惊讶地得到了13个赞成票)和评论表明对软件⼯程缺乏了解。
@WilliamEverett:表达式"false\0true"实际上计算为const char*指向程序内存中的特定字符串。如果x为1(真),则+6*x向该指针添加6;如果x为0(假),则为0。如果向指针添加0,printf将开始在'f'处读取,并在到达'\0'(空终⽌字符)时停⽌读取。如果添加6,则printf将开始读取't'并在字符串⾃然终⽌时停⽌读
取。但是,如果x不是0或1,则构造将失败,因此如果不能保证它,则需要@ R的修复。
@R:内联函数或带有⾃我记录名称的宏会有所帮助,但我担⼼⼈们仍会对构造感到⾮常困惑。解释伎俩背后的机制的评论也是合适的。
这是邪恶的酷。 Clang给了我⼀个警告"警告:在字符串中添加'int'不会附加到字符串[-Wstring-plus-int]"。⽽不是使⽤⼆进制加运算符,这可能会让⼈误以为他们正在使⽤隐式类型转换正确执⾏字符串连接。将代码编写为&"false\0true"[6 * x]会使编译器处于安装状态。
这可以进⾏优化以避免mul并使⽤shift(这仍然是⼤多数cpus /平台上的相关优化):"false\0\0\0true"+8*x
您可以使⽤C的条件(或三元)运算符:
(a > b) ?"True" :"False";
或者在你的情况下:
x ?"True" :"False" ;
这适⽤于at_least和negative函数,但不适⽤于between函数。我有void between(int x, bool* bet) { if (x >= LOWER && x <= UPPER) *bet = false; return; }作为我的代码。我不确定是什么问题。
x ?"true" :"false"
上⾯的表达式返回⼀个char *,因此您可以像这样使⽤:
puts(x ?"true" :"false");
要么
printf(" ... %s ...", x ?"true" :"false");
你可能想为此制作⼀个宏。
从技术上讲,它是⼀个const char*,⽽不是char*(虽然从前者到后者的转换已经弃⽤),但这与此⽆关。
当内联函数可以完成⼯作时,创建宏是没有意义的。
不,它是char *。这是C⽽不是C ++。
那么这个怎么样:
#include
#define BOOL_FMT(bool_expr)"%s=%s
", #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。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。