아마도 이것은 어리석은 질문이지만, 1이 "true"로 바뀌고 0이 "false"로 바뀌도록 부울 값을 문자열로 변환하는 방법이 있습니까? if 문을 사용할 수 있지만 언어 또는 표준 라이브러리로이를 수행 할 수있는 방법이 있는지 아는 것이 좋습니다. 게다가 저는 pedant입니다. :)
아마도 이것은 어리석은 질문이지만, 1이 "true"로 바뀌고 0이 "false"로 바뀌도록 부울 값을 문자열로 변환하는 방법이 있습니까? if 문을 사용할 수 있지만 언어 또는 표준 라이브러리로이를 수행 할 수있는 방법이 있는지 아는 것이 좋습니다. 게다가 저는 pedant입니다. :)
답변:
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::boolalpha
와std::noboolalpha
어떤 쇼 당신에게 콘솔 출력을하고 더 많은 API에 대해 설명합니다.
또한를 사용 std::boolalpha
하면의 전역 상태가 수정됩니다 std::cout
. 원래 동작을 복원 할 수 있습니다 . 상태 복원에 대한 자세한 내용은 여기로 이동하십시오std::cout
.
std::string str
만들고 변환 결과를 저장합니다.
우리는 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 : 이렇게 간단한 기능을 위해 전체 부스트 라이브러리를 포함 시키시겠습니까? 농담이야?
string
"true"및 "false"에 대한 문자열 상수가 정적 const 변수에 저장되어있는 경우 개선 될 수 있습니다 .
cout << (bool_x ? "true": "false") << endl;
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이 허용되지 않는 병목 현상이 있음을 알 수 그건 당신이 어떤 매크로 공포를하고 고려해야 할 때.
이것은 괜찮을 것입니다.
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";
}
매크로를 사용하기로 결정한 경우 (또는 향후 프로젝트에서 C를 사용하는 경우) 매크로 확장에서 'b'주위에 괄호를 추가해야합니다 (아직 다른 사람의 콘텐츠를 편집 할 포인트가 충분하지 않습니다).
#define BOOL_STR(b) ((b)?"true":"false")
이것은 숨겨진 작업 순서 오류로부터 보호 하는 방어적인 프로그래밍 기술입니다. 즉, 이것은 모든 컴파일러에 대해 어떻게 평가 됩니까?
1 == 2 ? "true" : "false"
에 비해
(1 == 2) ? "true" : "false"
다음과 같이 printf에서 삼항을 사용합니다.
printf("%s\n", b?"true":"false");
매크로를 사용하는 경우 :
B2S(b) ((b)?"true":"false")
그런 다음 전달하는 'b'
모든 것이 부작용이 없는지 확인해야합니다 . 'b'
컴파일 오류가 발생할 수 있으므로 주변의 괄호를 잊지 마십시오 .
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
이 게시물은 오래되었지만 이제 std::to_string
많은 변수를 std::string
.
http://en.cppreference.com/w/cpp/string/basic_string/to_string
boolalpha
bool을 문자열로 인쇄하는 데 사용 합니다.
std::cout << std::boolalpha << b << endl;
std::cout << std::noboolalpha << b << endl;