printfが無視されます

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
艦長
記事: 17
登録日時: 12年前

printfが無視されます

#1

投稿記事 by 艦長 » 11年前

こんにちは
以下のコードを、本を手本に書いたのですが、何故か結果は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)

アバター
asd
記事: 319
登録日時: 14年前

Re: printfが無視されます

#2

投稿記事 by asd » 11年前

艦長 さんが書きました:こんにちは
以下のコードを、本を手本に書いたのですが、何故か結果は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.実際はどう出力されるのか

を提示して質問するといいですよ。
私の確認した動作と質問者さんの期待した動作が同一である保障はありませんので(´・ω・`)
Advanced Supporting Developer
無理やりこじつけ(ぉ

艦長
記事: 17
登録日時: 12年前

Re: printfが無視されます

#3

投稿記事 by 艦長 » 11年前

すみません、端折って書いていました。
上記、コード通り書いて、実行結果は「-a オプション(改行)-s オプション」となることを期待していました。
しかし実際は、DOS窓が開いて、「続行するには、何かキーを押して下さい」と表示されるだけで、printfの内容が
表示されませんでした。
以上のような、状況でした。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: printfが無視されます

#4

投稿記事 by みけCAT » 11年前

asd さんが書きました:どのように実行されたのか不明ですが、以下のようにプログラム実行時に引数を指定しても
期待した動作をしないということでしょうか?
艦長 さんが書きました:すみません、端折って書いていました。
上記、コード通り書いて、実行結果は「-a オプション(改行)-s オプション」となることを期待していました。
しかし実際は、DOS窓が開いて、「続行するには、何かキーを押して下さい」と表示されるだけで、printfの内容が
表示されませんでした。
以上のような、状況でした。
肝心の実行方法の記述が見当たらないのですが…?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: printfが無視されます

#5

投稿記事 by みけCAT » 11年前

EasyIDECでプロジェクト名を"-abc" (引用符は除く)にして提示されたコードをmain.cに貼り付け、実行してみてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
asd
記事: 319
登録日時: 14年前

Re: printfが無視されます

#6

投稿記事 by asd » 11年前

艦長 さんが書きました:すみません、端折って書いていました。
上記、コード通り書いて、実行結果は「-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
► スポイラーを表示
Advanced Supporting Developer
無理やりこじつけ(ぉ

艦長
記事: 17
登録日時: 12年前

Re: printfが無視されます

#7

投稿記事 by 艦長 » 11年前

皆さんのご意見、よくわかりました。
バッチファイルの件は、実際にメモ帳で開いてみましたが、わからない上難しそうなので、やめておきます。
残念。。。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: printfが無視されます

#8

投稿記事 by みけCAT » 11年前

実行結果が「-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;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

艦長
記事: 17
登録日時: 12年前

Re: printfが無視されます

#9

投稿記事 by 艦長 » 11年前

みけCATさん、ありがとうございます!
早速、試してみた結果、見事に成功しました。
ありがとうございます。m(__)m
もっと勉強しないとダメですね。。。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: printfが無視されます

#10

投稿記事 by softya(ソフト屋) » 11年前

今回の問題点は、作るプログラムの実行方法及び動作の詳細を完全に把握できていなかったことではないでしょうか。
※ ここを根掘り葉掘り聞いてもらうべきでした。

あと動かない時に、argcの値をprintfしてみるなど動かない場合に考えうる想定外の動作を確認することも必要でした。デバッグの基本的な作業となります。
最初に「本を手本に書いた」とありますが動作を理解せず写経してもあまり意味はありません。
どうやったら理解できるか常に考えて、 while (argc>0){は何のために必要なのか? argcって何? って所まで分解して考えて頂きたいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る