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
*シェルではなく、プログラム自体によって解釈されます。\*または"*"を使用して、*をプログラムに渡します。
mch 9:22

5
問題は、シェルによってに*変換さ"file1 file2 ..."れることです。Cプログラムに問題はありません(ただし、含める<stdlib.h>必要はありません)。変換するには、シェルを防ぐためにスター:引用符を使用program.exe 1 2 3 "*"
PMGを

助けてくれてありがとう
stasio14

質問とは関係ありませんが、厳密にchar const* argv[]は正しくありません。自分でmain()の形式を発明することはできません。コンパイラだけがそれを行うことができます。argv多くの場合、書き込みは最善のアイデアではありませんが、実際には読み取り/書き込みメモリです。
ランディン

1
Windows cmdシェルはワイルドカード拡張を実行しません。cmdシェルから実行されていないか、シェルが行う拡張をエミュレートするロジックをコンパイラが挿入しています
ikegami

回答:


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はoutを提供します。以下をプログラムに追加すると、この動作が無効になります。

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
*
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.