尝试使用 tertiary/conditional 运算符将字符串与值进行比较,但它不起作用

Trying to compare a string to a a value with tertiary/conditional operator and it doesn't work

这里只是学习C++。

#include <iostream>
#include <string>   

int main()
{
    char name[1000];
    std::cout << "What is your name?\n";
    std::cin.get(name, 50);

    name == "Shah Bhuiyan" ? std::cout << "Okay, it's you\n" : std::cout<< "Who is this?\n";


    
}

所以我在这里写了一个程序,我在其中创建了一个变量名[100]。我使用 cin iostream 对象来获取变量 name 的输入。如果名称等于我的名字(如name == "Shah Bhuiyan" :中所见)则输出第一件事或输出'Who are you?'

而不是输出 'Oh, it's you' 它输出 'who is this?'

为什么这不起作用?

数组没有比较运算符。 实际上在这个表达式中

name == "Shah Bhuiyan"

比较了两个指针(由于数组指示符隐式转换为指向其第一个元素的指针):第一个是指向字符数组名称第一个字符的指针,第二个是指向字符串文字的第一个字符。

由于数组和字符串文字占用不同的内存范围,因此地址比较的结果始终为 false。

您需要使用标准的 C 字符串函数 strcmp 来比较两个字符串。

#include <cstring>

//...

std::strcmp( name, "Shah Bhuiyan" ) == 0 ? std::cout << "Okay, it's you\n" : std::cout<< "Who is this?\n";

如果要使用相等运算符 ==,则使用 std::string.

类型的对象代替字符数组

您可以使用 std::getline 读入 std::string 而不是 C 风格的 char 缓冲区。

您的代码使用了字符数组。任何使用 == 的比较都会比较它们的内存地址。由于 name"Shah Bhuiyan" 是两个不同的字符数组,因此它始终为 false。

显而易见的解决方案是使用标准库中的 c++ 字符串:

#include <iostream>
#include <string>   

int main()
{
    std::string name;
    std::cout << "What is your name?\n";
    std::getline(std::cin, name);

    name == "Shah Bhuiyan" ? std::cout << "Okay, it's you\n" : std::cout<< "Who is this?\n";
}

std::string 类型定义了运算符,可以在此处执行正确的操作,并将比较每个运算符的值。