ページ 1 / 1
printfが無視されます
Posted: 2014年7月13日(日) 16:11
by 艦長
こんにちは
以下のコードを、本を手本に書いたのですが、何故か結果はprintfが無視されたものが帰って来ます。
何故なのでしょうか?
念のため、本と書いたコードを見比べましたが、間違えはなさそうです。
宜しくお願い申し上げます。
コード:
#include <stdio.h>
int main(int argc, char *argv[])
{
while (argc>0){
argc--;
if(argv[argc][0]=='-'){
if(argv[argc][1]=='a') printf("-a オプション\n");
if(argv[argc][1]=='s') printf("-s オプション\n");
}
}
return 0;
}
使用PC:WindowsXP(SP3)
開発環境:EasyIDEC ver0.0.9.0
使用テキスト:苦しんで覚えるC言語(P366)
Re: printfが無視されます
Posted: 2014年7月13日(日) 16:27
by asd
艦長 さんが書きました:こんにちは
以下のコードを、本を手本に書いたのですが、何故か結果はprintfが無視されたものが帰って来ます。
何故なのでしょうか?
どのように実行されたのか不明ですが、以下のようにプログラム実行時に引数を指定しても
期待した動作をしないということでしょうか?
コード:
[***@localhost clang]$ ./a.out -a
-a オプション
[***@localhost clang]$ ./a.out -s
-s オプション
[***@localhost clang]$ ./a.out -s -a
-a オプション
-s オプション
gcc4.1.2で実行する限り期待した動作をしているようです。
提示されているプログラムはプログラム実行時の引数を利用するため、
実行時に引数を指定しないと期待した動作はしないと思われます。
---以下、追記
うまく動かない場合には、
1.どのように実行したのか
2.自分ではどのような出力を期待していたのか
3.実際はどう出力されるのか
を提示して質問するといいですよ。
私の確認した動作と質問者さんの期待した動作が同一である保障はありませんので(´・ω・`)
Re: printfが無視されます
Posted: 2014年7月13日(日) 18:18
by 艦長
すみません、端折って書いていました。
上記、コード通り書いて、実行結果は「-a オプション(改行)-s オプション」となることを期待していました。
しかし実際は、DOS窓が開いて、「続行するには、何かキーを押して下さい」と表示されるだけで、printfの内容が
表示されませんでした。
以上のような、状況でした。
Re: printfが無視されます
Posted: 2014年7月13日(日) 18:40
by みけCAT
asd さんが書きました:どのように実行されたのか不明ですが、以下のようにプログラム実行時に引数を指定しても
期待した動作をしないということでしょうか?
艦長 さんが書きました:すみません、端折って書いていました。
上記、コード通り書いて、実行結果は「-a オプション(改行)-s オプション」となることを期待していました。
しかし実際は、DOS窓が開いて、「続行するには、何かキーを押して下さい」と表示されるだけで、printfの内容が
表示されませんでした。
以上のような、状況でした。
肝心の実行方法の記述が見当たらないのですが…?
Re: printfが無視されます
Posted: 2014年7月13日(日) 18:44
by みけCAT
EasyIDECでプロジェクト名を"-abc" (引用符は除く)にして提示されたコードをmain.cに貼り付け、実行してみてください。
Re: printfが無視されます
Posted: 2014年7月13日(日) 19:52
by asd
艦長 さんが書きました:すみません、端折って書いていました。
上記、コード通り書いて、実行結果は「-a オプション(改行)-s オプション」となることを期待していました。
しかし実際は、DOS窓が開いて、「続行するには、何かキーを押して下さい」と表示されるだけで、printfの内容が
表示されませんでした。
以上のような、状況でした。
みけCATさんからも指摘がありますが実行方法の記述がありませんでした。
ので、実行環境EasyIDECを実際に試してみました。
現在のバージョンでは実行時引数(コマンドライン引数)には対応していないようですね。
みけCATさんのように若干裏技的な方法を使う方法とコンパイル後に生成されるバッチファイル(run.bat)を編集する方法がありますが、
後者の方法についてはちょっとハードルが高いので自信がなければ避けておいたほうが無難です。
ちょうど今回提示されているプログラムが掲載されているページは以下でした。
17. ファイルの取り扱い-3.ドラッグへの対応
http://9cguide.appspot.com/17-03.html
この前のページにてファイルの入出力について記述がありますが、
こちらを実行していればtest.txtを出力したり、読み込んだりしているはずです。
そのtest.txtファイルをEasyIDECからではなく、エクスプローラから見つけることができ、メモ帳などで編集できるのであれば
おそらくrun.batを編集することも可能かなとは思います。
念のため畳んでおきます。
難しいと思ったら避けておいたほうがいいかもです(ノ∀`)b
► スポイラーを表示
まずは上記にて打ち込んだプログラムが格納されているプロジェクトフォルダを開きます。
そうすると以下のようなファイルがあると思います。
・main.c
・(プロジェクト名).exe
・run.bat
このうちrun.batを実行するとEasyIDECで実行したものと同じウィンドウが開き、
同じ結果が表示されると思います。
念のためmain.cの中も確認しておき、自分で打ち込んだプログラムと同じものかを見ておくといいと思います。
続いてrun.batをメモ帳などのテキストエディタで開きます。
開くと以下のような記述になっていると思います。
コード:
@ECHO OFF
(プロジェクトの名前).exe
PAUSE
上記のうち”(プロジェクトの名前).exe”の行がプログラムを実行するためのコマンドラインとなっていますので、
この行を編集して以下のように半角スペースと-aを記述します。
コード:
@ECHO OFF
(プロジェクトの名前).exe -a
PAUSE
上記の編集をしたら上書き保存をして、エクスプローラ上からrun.batを実行してみてください。
以下のように-a オプションとの出力がされると思います。
○実行結果
コード:
-a オプション
続行するには何かキーを押してください . . .
ここで注意したいのは、このrun.batファイルはEasyIDEC上からプログラム実行をするたびに上書きされてしまうので、
手動で編集して実行する必要があります。
複数のオプションをつけたい場合はさらに半角スペースと一緒に追加します。
コード:
@ECHO OFF
(プロジェクトの名前).exe -a -s
PAUSE
○実行結果
コード:
-a オプション
-s オプション
続行するには何かキーを押してください . . .
Re: printfが無視されます
Posted: 2014年7月13日(日) 20:12
by 艦長
皆さんのご意見、よくわかりました。
バッチファイルの件は、実際にメモ帳で開いてみましたが、わからない上難しそうなので、やめておきます。
残念。。。
Re: printfが無視されます
Posted: 2014年7月13日(日) 21:23
by みけCAT
実行結果が「-a オプション(改行)-s オプション」となるように改造してみました。
コード:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int option_found=0;
while (argc>0){
argc--;
if(argv[argc][0]=='-'){
if(argv[argc][1]=='a'){
printf("-a オプション\n");
option_found = 1;
}
if(argv[argc][1]=='s'){
printf("-s オプション\n");
option_found = 1;
}
}
}
if(!option_found){
char command[1024];
sprintf(command,"%s -s -a",argv[0]);
system(command);
}
return 0;
}
Re: printfが無視されます
Posted: 2014年7月14日(月) 19:09
by 艦長
みけCATさん、ありがとうございます!
早速、試してみた結果、見事に成功しました。
ありがとうございます。m(__)m
もっと勉強しないとダメですね。。。
Re: printfが無視されます
Posted: 2014年7月14日(月) 20:27
by softya(ソフト屋)
今回の問題点は、作るプログラムの実行方法及び動作の詳細を完全に把握できていなかったことではないでしょうか。
※ ここを根掘り葉掘り聞いてもらうべきでした。
あと動かない時に、argcの値をprintfしてみるなど動かない場合に考えうる想定外の動作を確認することも必要でした。デバッグの基本的な作業となります。
最初に「本を手本に書いた」とありますが動作を理解せず写経してもあまり意味はありません。
どうやったら理解できるか常に考えて、 while (argc>0){は何のために必要なのか? argcって何? って所まで分解して考えて頂きたいです。