C++ 将char转换为bool(将bool传递到main)

C++ 将char转换为bool(将bool传递到main),c++,boolean,main,C++,Boolean,Main,有没有推荐/正确/更安全的方法将bool参数传递给主函数 这是吗 $ ./my_software true 将此设置为my_软件: int main(argc, argv* []){ bool my_bool = argv[1]; return 0; } int main(argc, argv* []){ bool my_bool = atoi(argv[1]); return 0; } 还有这个 $ ./my_software 1 将此设置为my

有没有推荐/正确/更安全的方法将bool参数传递给主函数

这是吗

$ ./my_software true
将此设置为my_软件:

int main(argc, argv* []){

    bool my_bool = argv[1];

    return 0;
}
int main(argc, argv* []){

    bool my_bool = atoi(argv[1]);

    return 0;
}
还有这个

$ ./my_software 1
将此设置为my_软件:

int main(argc, argv* []){

    bool my_bool = argv[1];

    return 0;
}
int main(argc, argv* []){

    bool my_bool = atoi(argv[1]);

    return 0;
}

等价物?第一个示例中是否缺少转换?

是的,第一个示例中缺少转换,大多数编译器都应该发出诊断。即使编译,代码也无法工作,因为它试图将原始字符指针转换为布尔值,甚至不会查看字符串的内容。

是的,第一个示例中缺少转换,大多数编译器都应该发出诊断。即使编译,代码也不会工作,因为它试图将原始字符指针转换为bool值,甚至不会查看字符串的内容。

至于正确的方法,有很多。但是你提出的方法是不安全的/不正确的。首先,不能保证
argv
的长度为2或更高,在查看
argv[1]
(或
argv
中的任何内容)之前,必须先检查
argc


第二,即使存在
argv[1]
中的特定内容,也不能保证您能获得它。它可以是任何字符串,而不仅仅是预期的
“0”或
“1”
(甚至可以是空字符串)因此,仅仅通过
atoi运行它可能不是一个明智的选择。

至于正确的方法,有很多。但是您提出的方法不安全/不正确。首先,您不能保证
argv
长度为2或更高,您必须在查看
argv[1]
之前检查
argc
(或
argv
中的任何内容)


第二,即使存在
argv[1]
中的特定内容,也不能保证您能获得它。它可以是任何字符串,而不仅仅是预期的
“0”或
“1”
(甚至可以是空字符串)因此,仅仅通过
atoi
运行它可能不是一个明智的选择。

C++流可以处理这个问题。不要忘记检查
argv[1]
是否确实存在

#include <sstream>
//...
std::stringstream ss(argv[1]);
bool b;

if(!(ss >> std::boolalpha >> b)) {
    // Parsing error.
}

// b has the correct value.
#包括
//...
std::stringstream ss(argv[1]);
布尔b;
如果(!(ss>>std::boolalpha>>b)){
//分析错误。
}
//b具有正确的值。


输入
std::boolalpha
流操纵器可以解析“true”和“false”,省略它可以解析“0”和“1”。

C++流可以处理这个问题。别忘了检查
argv[1]
是否确实存在

#include <sstream>
//...
std::stringstream ss(argv[1]);
bool b;

if(!(ss >> std::boolalpha >> b)) {
    // Parsing error.
}

// b has the correct value.
#包括
//...
std::stringstream ss(argv[1]);
布尔b;
如果(!(ss>>std::boolalpha>>b)){
//分析错误。
}
//b具有正确的值。


输入
std::boolalpha
流操纵器可以解析“true”和“false”,如果不输入它,它将解析“0”和“1”。

您可以传入“true”或“false”,但也可以传入“dunno”、“potato”或者什么都没有,这应该是一个提示,表明确实需要进行某些处理。您不仅在第一个程序中缺少转换,而且
atoi
只处理整数。您可以传入“true”或“false”,还可以传入“dunno”、“potato”或者什么都没有,这应该是一个提示,表明确实需要进行一些处理。您不仅缺少第一个程序中的转换,而且
atoi
只处理整数。那么我该如何处理这个问题呢?是否存在atob()?为什么行
bool my_bool=argv[1]
会发出警告?
argv[1]
具有指针类型,指针类型可以隐式转换为
bool
(请参阅)。要回答OP的问题,最学究式的正确答案是“bool value=atoi(argv[1])!=0。就警告而言,大多数编译器提供了一个选项,即使对于某些按照本书规定可能是洁净的方法,也可以发出警告,但会导致混淆(例如在布尔上下文中混合&&和| |,而不显式地打括号以明确其相对优先级)。这就是我所指的。即使这是正确的,从书上看,它看起来让我困惑。
atoi(“true”)==atoi(“false”)==0
。你提出的“学究式正确答案”是错误的。我在这里不是学究式的。使用a转换
“true”
/
“false”
到一个
bool
值。那么我如何处理这个问题呢?有没有像atob()这样的东西?为什么行
bool my_bool=argv[1]
要发出警告?
argv[1]
有指针类型,指针类型可以隐式转换为
bool
(请参阅)。要回答OP的问题,最学究式的正确答案应该是“bool value=atoi(argv[1])!=0;”。就警告而言,大多数编译器都提供了一个选项,即使对于某些按照本书可能是洁净的方法,也可以发出警告,但会导致混淆(比如在布尔上下文中混合&&和| |,而不显式地打括号以明确它们的相对优先级)。这就是我所指的。即使这是正确的,从书上看,它看起来让我困惑。
atoi(“true”)==atoi(“false”)==0
。你提出的“学究式正确答案”是不正确的。我在这里不是学究。使用a来转换
“true”
/
“false”
bool
值。谢谢,我已经有了一个函数检查argc,我可以巧妙地将您的示例合并到其中,提供我正在寻找的检查和在函数中分配参数的方法。此外,我以前从未见过Coliru,+1!谢谢,我已经有了一个函数检查argc,我可以请将您的示例合并到其中,提供我正在寻找的检查和在函数中指定参数的方法。此外,我以前从未见过Coliru,+1!