在 C++ 中使用命令行参数,随之而来的是混乱

Was playing around with command line arguments in c++, confusion ensues

我试图将 C++ 和 运行 中的命令行参数理解为一个(天真的)意外问题,因此我试图通过创建一个使用 auto 和一个 运行ge for 循环以及带有 std::string 和 运行ge for 循环的版本。只有后者给出了预期的结果。代码编译正常,我没有收到任何警告。

似乎 C++ 不允许我将 argv[] 与 validCharArgs[] 进行比较。我在有和没有 const 的情况下都试过了。

#include <iostream>
#include <string>

int main(int argc, char* argv[])
{
    const char* validCharArgs[3];
    validCharArgs[0] = "wat";
    validCharArgs[1] = "twa";
    validCharArgs[2] = "awt";

    std::cout << "You passed " << argv[1] << " as the program argument. " << std::endl;
    std::cout << "Valid char* arguments are: "
        << validCharArgs[0] << ", " << validCharArgs[1] << " and " << validCharArgs[2] << ". " << std::endl;

    std::cout << "(sizeof(validCharArgs)/8)" << " = " << (sizeof(validCharArgs)/8) << std::endl;

    std::cout << "Testing with char* & traditional for loop: " << std::endl;
    for (int i = 0; i < (sizeof(validCharArgs)/8); i++)
    {
        if (validCharArgs[i] == argv[1])
        {
            std::cout << "Valid argument passed. GREAT SUCCESS!!" << std::endl;
            break;
        }

        // My attempt at getting to the end of validCharArgs[] with no valid parameters
        if (validCharArgs[i] != argv[1] && i == (sizeof(validCharArgs)/8)-1) 
        {
            std::cout << "Invalid argument passed. " << std::endl;
        }
    }

    std::cout << "Testing with auto & range for loop: " << std::endl;
    for (auto c : validCharArgs)
    {
        if (c == argv[1])
        {
            std::cout << "Valid argument passed. GREAT SUCCESS!!" << std::endl;
            break;
        }
        else if (c != argv[1] && c == validCharArgs[2]) 
        {
            std::cout << "Invalid argument passed. " << std::endl;
        }
    }

    std::cout << "Testing with std::string & range for loop: " << std::endl;
    std::string argumentAsString = argv[1];
    for (std::string s : validCharArgs)
    {
        if (s == argumentAsString)
        {
            std::cout << "Valid argument passed. GREAT SUCCESS!!" << std::endl;
            break; 
        }
        else if (s != argumentAsString && s == validCharArgs[2])
        {
            std::cout << "Invalid argument passed. " << std::endl;
        }
    }

    return 0;
}

您无法直接比较 char*。您最终将比较指针,而不是字符串。要么使用 strcmp(),要么构造 std::string/std::string_view 并比较它们。