C主要参数


9

我写了一个必须显示主要参数的代码,但是当我编译它并键入“ *”程序时,它显示了我的文件结构。cmd中的命令如下所示:program.exe 1 2 3 *

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const* argv[]) {
    for (int i=0; i<argc; i++) printf("%s\n", argv[i]);
    return 0;
}

结果是:

program
1
2
3
program.c
program.exe
10-03-20
11-02-20

我的问题是:是否可以强制程序打印“ *”而不是列出文件。谢谢建议


5
*得到由外壳,而不是程序本身的解释。使用\*"*"将*传递给程序。
妇幼保健院

5
问题是您的外壳将*其转换为"file1 file2 ..."您的C程序没有任何问题(尽管<stdlib.h>没有必要包括在内)。为防止外壳转换为星形,请使用引号:program.exe 1 2 3 "*"
pmg

感谢您的帮助
stasio14

与问题无关,但严格来说,这char const* argv[]是不正确的。您可能不会自己发明main()的形式,只有编译器可以做到这一点。argv实际上,它是读/写内存,尽管对其进行写通常不是最好的主意。
伦丁

1
Windows cmd Shell不执行通配符扩展。要么不是从cmd shell运行,要么是编译器正在插入逻辑以模拟shell可以进行的扩展
ikegami

Answers:


5

mingw使程序执行参数的通配符扩展。将以下内容添加到您的程序中以禁用此行为:

int _CRT_glob = 0;

在Unix世界中,外壳程序有望执行通配符扩展。

$ perl -le'print for @ARGV' *
a
b

在Windows世界中,通配符扩展留给应用程序。

>perl -le"print for @ARGV" *
*

这使得编写可移植程序变得棘手。由于mingw通常用于编译不是为Windows编写的程序,因此它的C运行时库自动执行参数的通配符扩展。

a.c

#include <stdio.h>

int main(int argc, char const* argv[]) {
    for (int i=0; i<argc; i++)
        printf("%s\n", argv[i]);

    return 0;
}
>gcc -Wall -Wextra -pedantic-errors a.c -o a.exe & a *
a
a.c
a.exe

但是,mingw提供了一个解决方案。将以下内容添加到您的程序将禁用此行为:

int _CRT_glob = 0; 

a.c

#include <stdio.h>

int _CRT_glob = 0; 

int main(int argc, char const* argv[]) {
    for (int i=0; i<argc; i++)
        printf("%s\n", argv[i]);

    return 0;
}
>gcc -Wall -Wextra -pedantic-errors a.c -o a.exe & a *
a
*
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.