コマンドライン引数を使いたい、と思うこともあまり無いとは思いますが、一応出来たので書いておきます。
paiza.io でコマンドライン引数を使いたい場合
例えば、
#include <stdio.h> main(int argc,char **argv) { for(int i=0;i<argc;i++) { printf("argv[%d] == %s\n", i, argv[i]); } }
上記のようなC++コードを実行したいとします。これは、コマンドライン引数を順番に1個ずつ出力するプログラムです。この場合、言語選択をbashにして、
このようなコードを書きます。
echo '#include <stdio.h>' >> s.cpp echo 'main(int argc,char **argv) {' >> s.cpp echo ' for(int i=0;i<argc;i++) {' >> s.cpp echo ' printf("argv[%d] == %s\n", i, argv[i]);' >> s.cpp echo ' }' >> s.cpp echo '}' >> s.cpp g++ -x c++ s.cpp ./a.out 働 き た く な い
こうすると、次のような実行結果が得られます。
出力 :
argv[0] == ./a.out argv[1] == 働 argv[2] == き argv[3] == た argv[4] == く argv[5] == な argv[6] == い
解説
Linuxで使われるシェルのひとつであるbashを用いて、ソースコードの出力、コンパイル、実行までを行っています。echo ... >> s.cpp
というコマンドで、ソースコードをファイルに出力しています。次に、g++ というコマンドで、s.cppファイルをコンパイルしています。コンパイルに成功すると、a.outという実行形式ファイルが出力されます。最後に、このa.outファイルを実行しています。ちなみに、標準入力も普通に受け取ることが出来るようです。
ヒアドキュメントを使う場合 (5/20追記)
ヒアドキュメントを使うと楽に書くことが出来ます。echo <<EOS
ではなく cat <<EOS
なので注意して下さい。
cat > s.cpp << EOS #include <stdio.h> main(int argc,char **argv) { for(int i=0;i<argc;i++) { printf("argv[%d] == %s\n", i, argv[i]); } } EOS g++ -x c++ s.cpp # ignore \r ./a.out 働 き た く な い
複数ファイル編集を使う場合
paiza.io は複数ファイルの編集が出来るっぽいので、echoを使うよりもs.cpp を書いてコンパイルした方が楽っぽいです。+
と書かれているところをクリックするとファイルを追加できて、File1
と書かれているところをダブルクリックすると、ファイル名の変更が出来ます。
@paiza_run にコマンドライン引数を送りたい場合
Twitterでは140文字しか送ることができないので、少しコードを短くしてみました。また、gccではprintfがビルトイン関数として定義されているそうなので、1行目の#includeも省略します。
@paiza_run bash:echo 'i;main(int c,char **v){while(i<c){printf("%s\n",v[i++]);}}' >s.c
gcc s.c
./a.out 働 き た く な い— ゆいのあ (@yuinore) 2017年5月16日
すると、次のような結果が得られます。
@yuinore ./a.out
働
き
た
く
な
い #paiza_run_result— paiza_run (@paiza_run) 2017年5月16日
解説
これも大筋としては先程のものと同じで、ソースコードの書き出し、コンパイル、実行を順番に行っています。Cソースコード中の i;
は、グローバル変数の定義です。
他の言語の場合
もしコンパイル及び実行のコマンドが分からない場合、こちらに、AtCoderで用いられるコンパイル時・実行時に使用するコマンドが書かれていますので、これを参考にすれば他の言語でも出来ると思います。
C#
Main.sh :
mcs -warn:0 -o+ -r:System.Numerics Main.cs mono Main.exe 働 き た く な い
Main.cs :
using System; class Test{ public static void Main(string[] argv) { for(int i = 0; i < argv.Length; i++) { Console.WriteLine("argv[" + i + "] == " + argv[i]); } } }
実行結果:
argv[0] == 働 argv[1] == き argv[2] == た argv[3] == く argv[4] == な argv[5] == い
@paiza_run であれば、次のようになります。(文字数制限が厳しいですが)
@paiza_run bash:echo 'class T{static void Main(string[] v) {System.Console.Write(string.Join("\n",v));}}' >s mcs s mono s.exe 働 き た く な い
@paiza_run bash:echo 'class T{static void Main(string[] v) {System.Console.Write(string.Join("\n",v));}}' >s
mcs s
mono s.exe 働 き た く な い— ゆいのあ (@yuinore) 2017年5月16日
@yuinore 働
き
た
く
な
い #paiza_run_result— paiza_run (@paiza_run) 2017年5月16日
Python3 (5/17追記)
@paiza_run bash:echo 'import sys!for s in sys.argv:! print(s)'|tr ! '\n' >s.py
python3 -B s.py 働 き た く な い— ゆいのあ (@yuinore) 2017年5月17日
@yuinore s.py
働
き
た
く
な
い #paiza_run_result— paiza_run (@paiza_run) 2017年5月17日
tr
は、文字列を置換するコマンドです。
Scheme (5/17追記)
@paiza_run bash:echo '(define (main argv) (map print argv) 0)' >s.scm
gosh s.scm 働 き た く な い— ゆいのあ (@yuinore) 2017年5月17日
@yuinore s.scm
働
き
た
く
な
い #paiza_run_result— paiza_run (@paiza_run) 2017年5月17日
JavaScript (Node.js) (5/17追記)
@paiza_run bash:echo 'process.argv.map((x,i) => console.log(i + " " + x))' > s.js
node s.js 働 き た く な い— ゆいのあ (@yuinore) 2017年5月17日
@yuinore 0 /usr/local/bin/node
1 /workspace/s.js
2 働
3 き
4 た
5 く
6 な
7 い #paiza_run_result— paiza_run (@paiza_run) 2017年5月17日
さいごに
働
き
た
く
な
い