在 C++ 中使用双引号作为命令行参数时出现问题

Problem using double quotes as commandline argument in C++

提问人:Masoshi 提问时间:10/5/2023 最后编辑:Masoshi 更新时间:10/5/2023 访问量:79

问:

我正在尝试做一个程序,将“-m”检测为消息的参数,并在消息本身之间使用双引号。现在我只是试图检测消息是否以双引号开头,但我得到了一个意外的行为。

主要功能:

int main(int argc, char *argv[]){
    if (argc < 3){
        std::cerr << "Error! Bad usage of parameters" << std::endl;
        return 1;
    }

    for (int i = 1; i < argc - 1; i++){
        std::string arg = argv[i];
        std::string nextarg = argv[i+1];
        if(arg == "-m"){ 
            if(nextarg.empty() || nextarg[0] != '"'){
                std::cout << "nextarg[0]: " << nextarg[0] << std::endl; 
                std::cout << "arg: " << arg << std::endl;
                std::cerr << "Error, message must be on double quotes" << std::endl;
                return 1;
            }
            else {
                std::cout << "The code worked" << std::endl;
                std::cout << nextarg << std::endl;
                std::cout << arg << std::endl;
            }
            return 0;
        }
        else{
            std::cerr << "The value is invalid." << std::endl;
            return 1;
        }
    }
}

现在,我使用的输入是 ,预期的输出是:./compiled -m "foo foo"

The code worked
"foo foo"
-m

但实际输出是:

nextarg[0]: f
arg: -m
Error, message must be on double quotes

所以,我看到的问题可能是我的程序没有检测到第一个双引号。此外,如果我只使用一个双引号,输出会形成一个无限循环的“>”,要求我输入,我不希望在我的程序中出现这种行为。

顺便说一句,我不知道为什么,但是如果我使用这个输入,我的程序可以工作:,所以我认为这一定是终端本身的问题,但我仍然对此一无所知。./compiled -m "\"foo foo\""

C++ 终端 参数 双引号

评论

1赞 john 10/5/2023
是的,终端甚至在您的程序看到引号之前就删除了引号。
2赞 HolyBlackCat 10/5/2023
这是一种常见的行为。在 Linux shell 上会自动执行此操作,在 Windows 上,执行此操作的代码通常会自动嵌入到您的应用程序中(我认为?无论如何,这不是一件坏事。它允许您使用单个单词作为不带引号的消息,而无需在代码中处理它。
1赞 Gabriel Staples 10/5/2023
只需遍历字符串数组,在单独的一行上打印出每个参数即可开始调试。然后,练习用不同的引用模式传递不同的参数,以查看程序看到的结果,这样你就可以知道如何从那里解析它。argv
2赞 Marek R 10/5/2023
godbolt.org/z/6b9P3n1d6
3赞 Clifford 10/5/2023
这不是代码的问题,而是操作系统如何处理命令行参数的问题。从这个意义上说,这是题外话。shell 使用空格作为参数分隔符,因此包含空格的参数必须用引号括起来才能被视为单个参数,但它们不是参数的一部分。要在参数字符串中包含 anywhere,您需要使用 转义序列 。其他操作系统或命令 shell 可能会有所不同,并且可能支持其他方法。"\"

答: 暂无答案