我必须编写一个程序,其中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。

Logo

鸿蒙生态一站式服务平台。

更多推荐