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;
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。
c语言输出bool,关于printf:在c中打印bool结果为’false’或’true’的最佳方法?...相关推荐
- c语言金字塔输出乘法表,python中打印金字塔和九九乘法表的几种方法
# 打印九九乘法表 for i in range(1,10): for j in range(1,i+1): # x=i*j # print(i,'*',j,'=',x,end=' ') print( ...
- c语言case后接printf,C编程中switch。case 问题
int main() { int imonth; printf("请输入月份:\n"); scanf_s("%d",&imonth,2); switch ...
- c语言字符串 s,c – printf格式字符串中“% – *.* s”的含义是什么
你可以在这里阅读printf的手册页: http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html.但是它更像是法律文本 ...
- c语言int t格式,如何在C中打印int64_t类型
C99标准具有整数类型,字节大小类似int64_t.我使用下面的代码: #include #include int64_t my_int = 999999999999999999; printf(&q ...
- python列表输出奇数_Python程序在列表中打印奇数
在本文中,我们将学习解决给定问题陈述的解决方案和方法. 问题陈述 给定一个可迭代的列表作为输入,我们需要在给定的可迭代列表中显示奇数. 在这里,我们将讨论三种解决此问题的方法. 方法1-使用增强的fo ...
- python怎么输出结果_如何在python中打印SQLite查询的结果?
我试图打印这个SQLite查询的结果来检查它是否已经将数据存储在数据库中.目前它只打印None.有没有办法在Microsoft Word或LibreOffice等程序中打开数据库.只是为了看看它是否已 ...
- linux bool变量,Objective-C中的占位符,打印BOOL类型数据
常用的一些占位符: %@:字符串占位符 %d:整型 %ld:长整型 %f:浮点型 %c:char类型 %%:%的占位符 尽管有那么多的占位符,但是好像没有发现BOOL型的数据的占位符,这也是比较纠结的 ...
- Objective-c中的占位符,打印BOOL类型数据
常用的一些占位符: %@:字符串占位符 %d:整型 %ld:长整型 %f:浮点型 %c:char类型 %%:%的占位符 尽管有那么多的占位符,但是好像没有发现BOOL型的数据的占位符,这也是比较纠结的 ...
- c语言输出字符串缩进,C语言printf()和puts()的简单使用
程序在计算机的内存中运行,得出结果以后总是需要输出,这样我们才能查看程序的运行状况.C语言用于输出的主要方法是使用格式输出函数 printf( ) 和字符串输出函数 puts( ). printf( ...
最新文章
- 基于OpenCV的图像分割处理!
- BZOJ5319 洛谷4559 LOJ2551:[JSOI2018]军训列队——题解
- Button实现图文混排
- html页面取js里面的值,如何在javascript中获取HTML元素的样式值?
- 51单片机50个实例代码_常用的51单片机代码
- 解决读写分离过期读的几个方案
- NodeJS配置国内源
- freebsd 安装教程
- 分账汇总少了一笔 和 对账和商户汇总比基础表少了一笔 问题处理方式
- 网站调用百度地图 根据地址查询经纬度
- vant在cell中加表格_Vant Cell 单元格
- 如何设置jquery的ajax方法为同步
- cocos2d-x学习笔记番外篇05:如何快速屏蔽触摸
- python资料-python 资料
- 【架构】大型网站优化技术思路
- 使用卡方分箱进行数据离散化-python实现
- 基恩士PLC④--MAIN程序实例笔记
- 论文阅读《PatchMatchNet: Learned Multi-View Patchmatch Stereo》
- strlen函数php中文,strlen函数介绍与使用方法详解
- 【JS】常用效果总结