掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.23905

アスタリスクを引数に使用したい
投稿者---明日リスク(2005/11/01 01:33:16)


argcでパラメータ数チェックを行っているソースを作成しています。
元もとの仕様で、最初のパラメータが「**」だと「すべて」を意味します。
しかし、argcは引数に「*」が含まれると正しく動作せず、おかしな数を
返すため、正しくチェックができません。
普通に考えて「*」は予約語だと思うのですが、何とかただの文字列として
引数に使用することはできないでしょうか。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:アスタリスクを引数に使用したい 23906 ぽへぇ 2005/11/01 06:51:04
<子記事> Re:アスタリスクを引数に使用したい 23907 まきじ 2005/11/01 07:54:37


No.23906

Re:アスタリスクを引数に使用したい
投稿者---ぽへぇ(2005/11/01 06:51:04)


>環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
を守ってください。

>argcでパラメータ数チェックを行っているソースを作成しています。
 :(略)
>引数に使用することはできないでしょうか。

やりたいことがわかりません。

--- 現状 ---
あるディレクトリに1.txt, 2.txt,… とあった場合、
 a.out *
とやると
argv[0] a.out
argv[1] 1.txt
argv[2] 2.txt
argv[3] :

となる。

--- やりたいこと ---
 a.out **
argv[0] a.out
argv[1] **

ということ?

>元もとの仕様で、最初のパラメータが「**」だと「すべて」を意味します。
って何の仕様ですか?

>argcは引数に「*」が含まれると正しく動作せず、おかしな数を
>返すため、正しくチェックができません。
「おかしな数」とは?



この投稿にコメントする

削除パスワード

No.23908

Re:アスタリスクを引数に使用したい
投稿者---明日リスク(2005/11/01 09:04:43)


返信ありがとうございます。

>>環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
>を守ってください。

失礼しました。
OSはSolaris7、コンパイラはSPARC Version 5.000になります。

>--- やりたいこと ---
> a.out **
>argv[0] a.out
>argv[1] **
>
>ということ?

そうです。

>>元もとの仕様で、最初のパラメータが「**」だと「すべて」を意味します。
>って何の仕様ですか?

他の人の作成したソースのメンテなのですが、このような仕様で作成
されていました。

>>argcは引数に「*」が含まれると正しく動作せず、おかしな数を
>>返すため、正しくチェックができません。
>「おかしな数」とは?

例を書きます。
printf("%d\n",argc);
で引数の数を表示します。

./a.out 1
2
./a.out **
21
./a.out 1 **
22
./a.out 1 ** 1
23

というように、正しく引数の数が取れません。
不適切な書き方で申し訳ありませんでしたが、アドバイスいただければ
幸いです。


この投稿にコメントする

削除パスワード

No.23909

Re:アスタリスクを引数に使用したい
投稿者---まきじ(2005/11/01 09:14:43)


正しく動作しましたが?
[ソース]
#include<stdio.h>

int main(int argc, char** argv){

    printf("%d\n",argc);
    
    return 0;
}
[実行結果]
>program hoge
2
>program *
2
>program **
2
>program * hoge
3
>program ** hoge
3



この投稿にコメントする

削除パスワード

No.23910

Re:アスタリスクを引数に使用したい
投稿者---Blue(2005/11/01 09:21:16)


> OSはSolaris7、コンパイラはSPARC Version 5.000
でですか?
環境によってできないとかそういうの問題なのではないのでしょうか?

> ./a.out **
./a.out "**"
ってのはどうなんだろ。



この投稿にコメントする

削除パスワード

No.23911

Re:アスタリスクを引数に使用したい
投稿者---まきじ(2005/11/01 09:38:39)


>OSはSolaris7、コンパイラはSPARC Version 5.000
でですか?

XP VCTK2003 でした・・・orz m(__)m


この投稿にコメントする

削除パスワード

No.23927

Re:アスタリスクを引数に使用したい
投稿者---ぽへぇ(2005/11/01 20:26:04)


>例を書きます。
>./a.out 1 ** 1
>23

そのディレクトリに20個くらいファイルがあるのではないのでしょうか。
だとしたら、「その環境では正しい動作をしている」と考えられます。

残念ながら当方の手元にはSolarisがないので確認ができません。
回避方法は他の方のレスを参考にしてください。m(_ _)m

なおVC++ではライブラリのリンクの有無でワイルドカードの
展開する/しないが決まります。



この投稿にコメントする

削除パスワード

No.23907

Re:アスタリスクを引数に使用したい
投稿者---まきじ(2005/11/01 07:54:37)


>普通に考えて「*」は予約語だと思うのですが、何とかただの文字列として
>引数に使用することはできないでしょうか。

ポインタではなく "*hoge" という変数名にしたいと云う事ならできないです。
識別子名には、英数字(a-zA-z0-9)と_(アンダースコア)しか使用できません。


この投稿にコメントする

削除パスワード

No.23912

Re:アスタリスクを引数に使用したい
投稿者---RAPT(2005/11/01 10:18:27)


環境によって、アスタリスクは、カレントディレクトリに含まれる
すべてのファイル名を示す場合があります。

#include <stdio.h>
int main(int argc, char *argv[])
{
    printf("%d\n", argc);
    argv;
    return 0;
}

WindowsXP/VC++/ConsoleApp/コマンドプロンプトでは
> test **
2

WindowsXP/Cygwin/gccでは
> ./test **
26
(カレントディレクトリ内のファイル・ディレクトリの総数は25
 但し、名前がドットで始まるものを除く。)

> ./test "**"
2

ちなみに、Cygwinでは ? もファイル名1字にマッチするようです。
> ./test ???
4



この投稿にコメントする

削除パスワード

No.23914

Re:アスタリスクを引数に使用したい
投稿者---si(2005/11/01 11:46:26)


unux 系の場合、* は全てのファイルにマッチしますので、
コマンドシェルにより展開されて、ファイル名が渡されます。

プログラムに、* 文字を渡すには、エスケープする必要があります。

$ ./a.out \*


この投稿にコメントする

削除パスワード

No.23961

Re:アスタリスクを引数に使用したい
投稿者---明日リスク(2005/11/04 01:16:27)


>プログラムに、* 文字を渡すには、エスケープする必要があります。
>
>$ ./a.out \*

たくさんのレスありがとうございました。
返信が遅れてすみません。
ご指摘があったとおり、「argc」としてたくさんの数が表示されるのは
カレントディレクトリ内のファイル数を加算していたためでした。
回避方法としては、上記のエスケープでうまくいきました。
本当にいろいろありがとうございました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧