0

例如,如果用户在命令行中键入

匹配“你好”测试*in

这意味着在名称为“test”的所有.in 类型文件中找到“the”。

bool containMany=false;
int i;
for(i= 0; arguments[i]; i++){

    printf("ARGUMENTS  %s\n",arguments[i]);
    if(strstr(arguments[i],"*")){
        containMany=true;
        break;
    }
}

但它不起作用。论据是:

参数匹配

论据你好

参数 test0.in

参数 test1.in

参数 test2.in

那么当用户输入 "*" 时,我如何使 containsMany 变为真呢?

4

2 回答 2

2

那是因为你的 shell 会自动进行 glob 样式的替换。如果您不希望 shell 这样做,请将输入参数括在单引号中或使用反斜杠。

如果您的工作目录有文件 A 和 B,那么这个表达式:

test *

将被替换为

test A B

测试执行之前。

另一方面,如果您像这样运行:

test '*'

或像这样:

test \*

那么就不会有shell替换,你的程序实际上会看到星星。

于 2014-02-09T23:08:14.667 回答
0

传统上,shell 在命令行上执行通配符扩展——这就是它在 Unix 风格平台上完成的方式。如果不需要扩展,用户通常必须引用包含通配符的参数或转义通配符。

在 Windows 上,command.com/ cmd.exeshell执行文件名扩展。然而:

  • MinGW 工具链的运行时确实执行文件名通配符的扩展。要禁用此行为,CRT_noglob.o请将零初始化的全局变量链接或添加int _CRT_glob = 0;到您的 .c 文件之一,以禁用运行时的全局扩展。
  • MSVC 包含一个目标文件setargv.obj,如果这是您想要的行为,它将导致运行时扩展命令行文件名通配符。
于 2014-02-09T23:27:29.857 回答