Лучший способ напечатать результат bool как «false» или «true» в c? - PullRequest
16 голосов
/ 01 октября 2011

Мне нужно написать программу, в которой 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, который я не могу найти много.

Заранее спасибо за вашу помощь!

ADDENDUM:

Это повторяется в ответе ниже.

Это сработало для функций at_least и негатива, но не для функции между ними.У меня

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

в качестве кода.Я не уверен, что не так.

Ответы [ 4 ]

45 голосов
/ 01 октября 2011

Альтернативная версия без ответвлений:

"false\0true"+6*x
23 голосов
/ 01 октября 2011

Вы можете использовать условный (или троичный) оператор C:

  (a > b) ? "True" : "False";

или, возможно, в вашем случае:

  x ? "True" : "False" ;
15 голосов
/ 01 октября 2011

x ? "true" : "false"

Вышеприведенное выражение возвращает char *, поэтому вы можете использовать его так:

puts(x ? "true" : "false"); или printf(" ... %s ... ", x ? "true" : "false");

Возможно, вы захотитесделать для этого макрос.

3 голосов
/ 01 октября 2011

Так что насчёт этого:

#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 должно работать так же.

...