我已经看到数组argv(在c / c ++程序中)包含已被引号括起来的字符串。
例如,考虑以下程序:
#include <iostream>
using namespace std;
int main (int argc, char* argv[]) {
cout << argv[1];
}
执行时:
./prog 'asd'
我收到:
asd
有没有办法知道某个参数是否被linux中的引号(单数或双引号)剥离,而没有转义它们(如how to prevent losing double quotes in argv?中建议的那样)?
答案 0 :(得分:6)
C ++运行时不是从字符串中删除引号,而是从操作系统shell(例如Bash)中删除引号。后者有效地将参数传递给您的程序。所以,你需要遵循shell的规则。例如,在Bash中,您需要“转义”引号
./prog \"something\"
因为引号具有特殊含义。无法从C ++程序中“强制执行”引号,因为在运行程序之前它们会被删除。
答案 1 :(得分:1)
不是真的。 shell实际上剥离了引号,而不是C或C ++。可以安全地假设任何包含空格的argv
成员最初被引用。如果它不包含空格,则无法知道。
答案 2 :(得分:1)
这实际上与C / C ++剥离引号无关。它是shell(我假设你因为./prog而使用* nix)。
试试这个;
echo 'asd'
你不会看到任何引号。引号括起一个表达式,以便shell可以解析参数。如果输入:
echo '"asd"'
然后外引号告诉shell,内部的任何内容都是文字表达式。
echo "'asd'"