C ++에서 bool을 텍스트로 변환


93

아마도 이것은 어리석은 질문이지만, 1이 "true"로 바뀌고 0이 "false"로 바뀌도록 부울 값을 문자열로 변환하는 방법이 있습니까? if 문을 사용할 수 있지만 언어 또는 표준 라이브러리로이를 수행 할 수있는 방법이 있는지 아는 것이 좋습니다. 게다가 저는 pedant입니다. :)


6
반대! 현지화는 어떻습니까? 언어 자체에 언어 별 리터럴 상수가 포함 된 이유는 무엇입니까?
valdo

1
@valdo-제가 작업하고있는 프로젝트에서 국제화가 문제가되지 않았다고 확신합니다. 당시에는 학교 프로젝트 였을 것입니다.
Jason Baker

답변:


118

C ++ 언어 자체를 사용하는 것은 어떻습니까?

bool t = true;
bool f = false;
std::cout << std::noboolalpha << t << " == " << std::boolalpha << t << std::endl;        
std::cout << std::noboolalpha << f << " == " << std::boolalpha << f << std::endl;

최신 정보:

당신이 더 많은 코드의 4 개 라인보다 콘솔 출력없이 원하는 경우 방문하십시오 에 대해 이야기 cppreference.com의 페이지 std::boolalphastd::noboolalpha 어떤 쇼 당신에게 콘솔 출력을하고 더 많은 API에 대해 설명합니다.

또한를 사용 std::boolalpha하면의 전역 상태가 수정됩니다 std::cout. 원래 동작을 복원 할 수 있습니다 . 상태 복원에 대한 자세한 내용은 여기로 이동하십시오std::cout .


저는 C ++의 완전한 초보자입니다. 누군가 이것이 어떻게 작동하는지 설명해 줄 수 있습니까?
Chucky

4
@Chucky 연산자 오버로딩 을 이해할 때까지 이것이 어떻게 작동하는지 이해할 수 없습니다 . 어떻게 작동하는지 설명하는 것은이 질문의 범위를 훨씬 벗어납니다. 다른 질문으로 게시하거나 해당 질문에 대한 기존 답변을 찾아야합니다. 나는 후자를 추천한다 .
Michael Dorst 2013

2
이것은 부울을 텍스트로만 인쇄하고 텍스트 / 문자열로 변환하지 않습니다.
atoMerz 2014

그래서 이것은 어떤 방식으로 OP에 의해 주어진 "부울 값을 문자열로 변환"기준에 실패합니까?
graham.reeds 2014

2
이 코드는 부울을 문자열로 변환하지 않습니다. 가능한 경우 변수를 std::string str만들고 변환 결과를 저장합니다.
rozina

76

우리는 C ++에 대해 이야기하고 있습니까? 왜 우리는 여전히 매크로를 사용하고 있습니까!?

C ++ 인라인 함수는 매크로와 동일한 속도를 제공하며 형식 안전성 및 매개 변수 평가의 추가 이점 (Rodney 및 dwj가 언급 한 문제를 방지합니다.

inline const char * const BoolToString(bool b)
{
  return b ? "true" : "false";
}

그 외에도 특히 받아 들여지는 답변에 대해 몇 가지 다른 불만이 있습니다. :)

// this is used in C, not C++. if you want to use printf, instead include <cstdio>
//#include <stdio.h>
// instead you should use the iostream libs
#include <iostream>

// not only is this a C include, it's totally unnecessary!
//#include <stdarg.h>

// Macros - not type-safe, has side-effects. Use inline functions instead
//#define BOOL_STR(b) (b?"true":"false")
inline const char * const BoolToString(bool b)
{
  return b ? "true" : "false";
}

int main (int argc, char const *argv[]) {
    bool alpha = true;

    // printf? that's C, not C++
    //printf( BOOL_STR(alpha) );
    // use the iostream functionality
    std::cout << BoolToString(alpha);
    return 0;
}

건배 :)


@DrPizza : 이렇게 간단한 기능을 위해 전체 부스트 라이브러리를 포함 시키시겠습니까? 농담이야?


@NathanFellman, 허용되는 답변이 너무 느립니다. string"true"및 "false"에 대한 문자열 상수가 정적 const 변수에 저장되어있는 경우 개선 될 수 있습니다 .
Serge Rogatch 2015

다음과 같은 이유 때문에 문제가있는 대답입니다. 1. 때때로 "true 또는"false "가 아닌"yes "또는"no "를 원하고 때로는"success "대"failure "등을 원합니다. 2. 때로는 소문자, 때로는 대문자를 원합니다. 경우, 언젠가 타이틀 케이스.
einpoklum

2
질문을 읽으십시오. 정확히 요청 된 내용입니다.
OJ.

@einpoklum 원하는 변환에 대해 원하는만큼 많은 인라인 함수를 만드는 것을 막을 수있는 것은 없습니다.
rozina

2
위기 상황에서 할 수있는 일 :cout << (bool_x ? "true": "false") << endl;
Trevor Boyd Smith

22

C ++에는 적절한 문자열이 있으므로 사용하는 것이 좋습니다. 표준 헤더 문자열에 있습니다. #include <string>을 사용합니다. 더 이상 strcat / strcpy 버퍼 오버런이 없습니다. 더 이상 null 종결자가 누락되지 않습니다. 더 이상 복잡한 수동 메모리 관리가 없습니다. 적절한 값 의미를 가진 적절한 계수 문자열.

C ++에는 bool을 사람이 읽을 수있는 표현으로 변환하는 기능도 있습니다. 이전에 iostream 예제에서 힌트를 보았지만 텍스트를 콘솔 (또는 fstreams, 파일)로만 보낼 수 있기 때문에 약간 제한적입니다. 다행히도 C ++의 디자이너는 완전한 바보가 아니 었습니다. 콘솔이나 파일이 아니라 자동으로 관리되는 문자열 버퍼가 지원하는 iostream도 있습니다. 이를 스트링 스트림이라고합니다. #include <sstream>을 가져옵니다. 그러면 다음과 같이 말할 수 있습니다.

std::string bool_as_text(bool b)
{
    std::stringstream converter;
    converter << std::boolalpha << b;   // flag boolalpha calls converter.setf(std::ios_base::boolalpha)
    return converter.str();
}

물론이 모든 것을 입력하고 싶지는 않습니다. 다행히 C ++에는 여기에서 도움이 될 수있는 Boost 라는 편리한 타사 라이브러리도 있습니다. Boost에는 lexical_cast라는 멋진 기능이 있습니다. 다음과 같이 사용할 수 있습니다.

boost::lexical_cast<std::string>(my_bool)

이제 이것은 일부 매크로보다 오버 헤드가 더 높다고 말하는 것이 사실입니다. stringstreams는 사용자가 신경 쓰지 않는 로케일을 처리하고 동적 문자열 (메모리 할당 포함)을 생성하는 반면 매크로는 리터럴 문자열을 생성 할 수 있습니다. 그러나 반대로 stringstream 메서드는 인쇄 가능한 표현과 내부 표현 사이의 많은 변환에 사용될 수 있습니다. 거꾸로 실행할 수 있습니다. 예를 들어 boost :: lexical_cast <bool> ( "true")는 올바른 일을합니다. 숫자와 함께 사용할 수 있으며 실제로 올바른 형식의 I / O 연산자가있는 모든 유형을 사용할 수 있습니다. 그래서 그들은 매우 다양하고 유용합니다.

그리고 만약이 모든 당신의 프로파일 링 및 벤치마킹 한 후에는 lexical_casts이 허용되지 않는 병목 현상이 있음을 알 수 그건 당신이 어떤 매크로 공포를하고 고려해야 할 때.


3
boost :: lexical_cast <bool> ( "true")가 bad_lexical_cast 예외를 던지는 것 같습니다
User

3
내 앱에서 작동하지 않습니다. "isExist :"+ boost :: lexical_cast <std :: string> (isExit)); 결과 isExist : 0
Scott 混合 理论

8

이것은 괜찮을 것입니다.


const char* bool_cast(const bool b) {
    return b ? "true" : "false";
}

그러나 더 C ++ 스타일을 원한다면 다음을 수행하십시오.


#include <iostream>
#include <string>
#include <sstream>
using namespace std;

string bool_cast(const bool b) {
    ostringstream ss;
    ss << boolalpha << b;
    return ss.str();
}

int main() {
    cout << bool_cast(true) << "\n";
    cout << bool_cast(false) << "\n";
}

5

매크로를 사용하기로 결정한 경우 (또는 향후 프로젝트에서 C를 사용하는 경우) 매크로 확장에서 'b'주위에 괄호를 추가해야합니다 (아직 다른 사람의 콘텐츠를 편집 할 포인트가 충분하지 않습니다).

#define BOOL_STR(b) ((b)?"true":"false")

이것은 숨겨진 작업 순서 오류로부터 보호 하는 방어적인 프로그래밍 기술입니다. 즉, 이것은 모든 컴파일러에 대해 어떻게 평가 됩니까?

1 == 2 ? "true" : "false"

에 비해

(1 == 2) ? "true" : "false"

2k rep을 갖기 전에도 실제로 다른 사람의 콘텐츠를 편집 할 수 있습니다. 검토되지만 물론 가능합니다.
SysDragon

2

다음과 같이 printf에서 삼항을 사용합니다.

printf("%s\n", b?"true":"false");

매크로를 사용하는 경우 :

B2S(b) ((b)?"true":"false")

그런 다음 전달하는 'b'모든 것이 부작용이 없는지 확인해야합니다 . 'b'컴파일 오류가 발생할 수 있으므로 주변의 괄호를 잊지 마십시오 .


'b'는 매크로 정의에서 한 번만 표시되므로 부작용에 대해 경고하는 이유는 무엇입니까?
포스트 퓨처리스트

2

C ++ 11에서는 람다를 사용하여 약간 더 간결한 코드를 얻을 수 있습니다.

bool to_convert{true};
auto bool_to_string = [](bool b) -> std::string {
    return b ? "true" : "false";
};
std::string str{"string to print -> "};
std::cout<<str+bool_to_string(to_convert);

인쇄물:

string to print -> true


1

ostream을 드래그하지 않고 :

constexpr char const* to_c_str(bool b) {
   return  
    std::array<char const*, 2>{"false", "true "}[b]
   ;
};

0

boolalphabool을 문자열로 인쇄하는 데 사용 합니다.

std::cout << std::boolalpha << b << endl;
std::cout << std::noboolalpha << b << endl;

C ++ 참조


0

간단한 것은 어떻습니까?

constexpr char const* toString(bool b)
{
   return b ? "true" : "false";
}

-5

매크로가 가장 적합 할 수 있다는 데 동의합니다. 나는 방금 테스트 케이스를 채찍질했다 (나는 C / C ++에 능숙하지 않지만 이것은 재미있게 들렸다) :

#include <stdio.h>
#include <stdarg.h>

#define BOOL_STR(b) (b?"true":"false")

int main (int argc, char const *argv[]) {
    bool alpha = true;
    printf( BOOL_STR(alpha) );
    return 0;
}

-5

문자열을 문자 배열로 직접 볼 수있는 std::string한 C ++에서 문자열을 일급 시민으로 표현 한다는 사실을 저에게 확신시키기가 정말 어려울 것입니다 .

게다가 할당과 경계를 결합하는 것은 어쨌든 나에게 나쁜 생각 인 것 같습니다.


-7

이 매크로를 사용해보십시오. "true"또는 false가 표시되기를 원하는 모든 곳에서 PRINTBOOL (var)로 바꾸십시오. 여기서 var는 텍스트를 원하는 부울입니다.

#define PRINTBOOL(x) x?"true":"false"

2
해당 매크로에 괄호가 필요합니다. 이것이 아마도 당신이 반대표를 얻은 이유 일 것입니다.
포스트 퓨처리스트
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.