如何确定用户在命令行输入“*”以指示C中的多个文件

时间:2014-02-09 23:00:36

标签: c arguments argc

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

  

中匹配“hello”test *

表示在所有.in类型的文件中找到名为“test”的文件中的“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;
    }
}

但它不起作用。论点是:

  

ARGUMENT匹配

     

ARGUMENT你好

     

ARGUMENT test0.in

     

ARGUMENT test1.in

     

ARGUMENT test2.in

所以当用户输入“*”?

时,如何使containsMany变为true

2 个答案:

答案 0 :(得分:2)

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

如果你的工作目录有文件A和B,则表达式为:

test *

将替换为

test A B
在测试执行之前

另一方面,如果你这样跑:

test '*'

或者像这样:

test \*

然后就没有shell替换,你的程序实际上会看到这个星。

答案 1 :(得分:0)

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

在Windows上,command.com / cmd.exe shell执行而不是执行文件名扩展。但是:

  • MinGW toochain的运行时 执行文件名通配符的扩展。要禁用此行为,请链接CRT_noglob.o或将零初始化的全局变量int _CRT_glob = 0;添加到您的.c文件之一以禁用运行时的glob扩展。
  • MSVC包含一个目标文件setargv.obj,如果这是您想要的行为,将导致运行时扩展命令行文件名通配符。