コマンドの引数 – プログラミング – Home

通知
すべてクリア

コマンドの引数


サガ
 サガ
(@サガ)
ゲスト
結合: 22年前
投稿: 13
Topic starter  

こんばんわ
またまた単純な質問ですが、
以下のようにコマンド引数を
char,short,char*
それぞれに入れたいのですが、charがうまくいきません。
どなたか、宜しくお願いします。

char aaa;
short bbb;
char* ccc;
void main(int argc, char *argv[]) {
if (argc > 1)
aaa = atoi(argv[1]);
if (argc > )
bbb = atoi(argv[1]);
if (argc > )
ccc = atoi(argv[1]);
}


引用解決済
トピックタグ
ax
 ax
(@ax)
ゲスト
結合: 22年前
投稿: 10
 

「うまくいかない」ではわかりません。
どういう動作を期待して実際どのように動作したか具体的に書いてください。


返信引用
zeta
 zeta
(@zeta)
ゲスト
結合: 22年前
投稿: 20
 

仕事のプレッシャーのため不眠症気味です(^^;
さて、単にソースファイルを見た限りでうまくいかない理由を推察するとすれば、

1バイトのサイズを持つchar型に(一般的に)4バイトのサイズを持つint型の
値を代入してます。たぶん、-127~127以外の値は代入されないと思います。

あとは具体的にうまくいかない状況を述べていただかないと答えようないです。

ではでは


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200301/03010046.txt
マルチスレッドになっています、どちらか「済」マークしてください

ほかの方が言うようにコンパイルエラー出てませんか?

>char* ccc;
これもおかしくないですか
実態のない char ポインタでしょ?

>aaa = atoi(argv[1]);
で異常終了していて、最後まで実行結果見れていないのでは
無いでしょうか
ここ間違ってたら、だれかフォローして・・・


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

>マルチスレッドになっています、どちらか「済」マークしてください

気づかないで、別のほうにレスしてました。

どうも初心者だと思われましたので、特別サービスです。

>char aaa;
>short bbb;
>char* ccc;
>void main(int argc, char *argv[]) {
> if (argc > 1)
> aaa = atoi(argv[1]);
> if (argc > )
> bbb = atoi(argv[1]);
> if (argc > )
> ccc = atoi(argv[1]);
sprintf( ccc, %s, argv[3]);
>}

char aaa;
short bbb;
char ccc[256]; // 実態がなかった(サイズは適当)
void main(int argc, char *argv[]) {
if (argc > 1)
aaa = (char)atoi(argv[1]);
if (argc > 2) // 数値が入ってなかった
bbb = (short)atoi(argv[2]); // 引数が違った
if (argc > 3) // 数値が入ってなかった
sprintf( ccc, %s, argv[3]); // 文字列の処理でなかった
// 、引数が違った
}


返信引用
サガ
 サガ
(@サガ)
ゲスト
結合: 22年前
投稿: 13
Topic starter  

いつもありがとうございます。
そして質問がわかり難くすみません。

今日も質問させてください。

const char *IP = 10.15.XX.XX;
int aaa = atoi(s);

上記のようにconst char *で取得したIPアドレスの下位15ビットを
aaaにいれなければならないのですが、意味がよくわかりません。

済みませんが
どなたかよろしくお願いします。


返信引用
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

「文字列として受け取ったIPアドレスの、下位15ビットを取り出したい」ということでよ
ろしいですか?

その前に、上記の文章がどういう意味かおわかりになっていますか?

IPアドレスは0~255の数値4つで構成されているように見えますが、実は32bitの1つの数
値です。上記の文章は、「4つの10進数(に見える文字列)で表現されている数値を32bitの
1つの数値に変換して、それの下位15bitを取り出したい」と等価だと解釈できます。

文字列から4つの数値を取り出し、
32bitの1つの数値を作り出し、
下位15bitを取り出す。

という手順になります。


返信引用
サガ
 サガ
(@サガ)
ゲスト
結合: 22年前
投稿: 13
Topic starter  

その通りです。
そして教えていただいた内容は理解しました。
ありがとうございます。

もうひとつだけ教えてください。
>下位15bitを取り出す。

を具体的に教えて頂きたいのですが・・・
よろしくお願いします。


返信引用
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

>>下位15bitを取り出す。
>を具体的に教えて頂きたいのですが

................................
という32のbitがあったとしたら、「下位15bit」というのは、
.................XXXXXXXXXXXXXXX

だけをとりだす、ということです。「12.34.56.78」というIPアドレスだったら、32bit値は
00001100001000100011100001001110 (2進数。16進なら0x0c22384e)
になります。これの「下位15bit」を取る、ということは
00000000000000000011100001001110
ということです。どういう操作をしたか(数学的に)言えますか?
00000000000000000011111111111111 (16進だと0x7fff)とのANDを取った、ということです。

C, C++でAND演算子は「&」です。


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

 私のレスに対して、よかったかどうかの回答がなかったのですが
よろしかったのでしょうか?
 (プログラム修正のコメントまで書いたのですが)

 1.最初に4個のアドレスを文字列へコピーする。
 2.このIPアドレスを32ビットに変換する。
    確か、関数があったと思う。
    なくても自分で関数を作る
 3.tibさんのおっしゃるようにANDで上位17ビットをマスクする。

でよいと思いますが。


返信引用
サガ
 サガ
(@サガ)
ゲスト
結合: 22年前
投稿: 13
Topic starter  

みなさんレス有難うございます。
もうひとつ質問させてください。

> 1.最初に4個のアドレスを文字列へコピーする。
とありますが、

 取得したIPアドレスが「const char *s 」
なのですが、それから文字列コピーの方法を教えてください.

初心者なもので申し訳ありません。宜しくお願いします。


返信引用
努力無き教えて君(さん)は去れ!
 努力無き教えて君(さん)は去れ!
(@努力無き教えて君(さん)は去れ!)
ゲスト
結合: 22年前
投稿: 1
 

オンランヘルプとかさぁ、C/C++の本読んで自分で勉強しなよ。
そのくらいのことは。
初心者、初心者ってねぇ。初心者だからって何でも許されると思わないほうがいい。
初心者なら初心者のレベルに見合ったプログラム作って、少しつづステップアップ
していくもんじゃない?


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

最初の質問とだいぶ違ってきていると思いますけど?
別スレッド立てたらどうですか

>取得したIPアドレスが「const char *s 」
>なのですが、それから文字列コピーの方法を教えてください.

C++ではなく、C言語の基礎学習やり直してみてはどうですか


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました