【问题标题】:C main parameterC主要参数
【发布时间】:2020-07-11 19:18:07
【问题描述】:

我编写了一个必须显示主要参数的代码,但是当我编译它并输入“*”时,程序会显示我的文件结构。 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

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

【问题讨论】:

  • * 由 shell 解释,而不是程序本身。使用\*"*" 将* 传递给程序。
  • 问题是*被你的shell转换成"file1 file2 ..."您的 C 程序没有任何问题(尽管不需要包含 &lt;stdlib.h&gt;)。为了防止 shell 转换 star 使用引号:program.exe 1 2 3 "*"
  • 与问题无关,但严格来说char const* argv[]是不正确的。您可能不会自己发明 main() 的形式,只有编译器可以这样做。 argv 实际上是读/写内存,尽管写入它通常不是最好的主意。
  • 我试过"*",但我给出了相同的结果。我也试过\*,但这给了\$Recycle.Bin
  • Windows cmd shell 不执行通配符扩展。要么不是从 cmd shell 运行,要么编译器正在插入逻辑来模拟 shell 会做的扩展

标签: c parameters mingw main wildcard-expansion


【解决方案1】:

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

int _CRT_glob = 0;

在 unix 世界中,shell 预计会执行通配符扩展。

$ 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
*

【讨论】:

    猜你喜欢
    • 2018-10-20
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 2020-06-09
    • 2013-06-07
    • 2012-09-28
    • 2012-11-14
    • 1970-01-01
    相关资源
    最近更新 更多