0

私は主な機能を持っています、

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

2 つの異なるコマンドライン引数を渡すことになっています。

argv[1]=IP ADDRESS type
argv[2]=INTEGER type

たとえば、./a.out IP-ADDRESS INTEGER. このバイナリを他のスクリプトで呼び出しています。

問題は、が利用できない間、 value asargv[1]のように動作することです。INTEGERargv[1]

argvタイプINTが にならないargv[1]か、タイプのみIP-ADDRESSが許可されているかどうかをチェックするにはどうすればよいargv[1]ですか?

4

4 に答える 4

5

メイン関数に渡される char **argv 変数は、単なる「引数」の配列ではなく、シェルで入力したヌル終了文字列のみを含む char* の配列です。

例として、でプログラムを呼び出すと./a.out 127.0.0.1 12、argv は次のようになります。

argv[0] = "./a.out\0"

argv[1] = "127.0.0.1\0"

argv[2] = "12\0"

argv[3] = NULL

文字列を希望どおりに処理するには、文字列を変換して argv に格納するコードを作成する必要があります。

于 2013-01-08T13:30:51.823 に答える
2
int main (int argc, char **argv)

より一般的には次のように表現されます。

int main (int argc, char *argv[])

つまりargv、char の配列へのポインターです。これらの文字が何を表すかはあなた次第ですが、通常、コマンドラインでプログラムが呼び出されると、これらはゼロで区切られた文字列になります。

ユーザーが位置パラメータを指定しない場合は、オプションを使用する必要があります。を参照してくださいgetopt()

例えば:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

/* Options:
       -i : integer argument
       -p : ip address
*/
int main (int argc, char *argv[])
{
    int option;
    int integer = 0;
    char *ip_address = NULL;

    opterr = 0;
    while ( (option=getopt(argc, argv, "i:p:")) != EOF ) {
      switch ( option ) {
        case 'i': integer = atoi(optarg);
                  break;
        case 'p': ip_address = optarg;
                  break;
        case '?': fprintf(stderr,"Unknown option %c\n", optopt);
                  exit(1);
                  break;
      }
    }

    if (integer)    printf("INTEGER: %d\n", integer);
    if (ip_address) printf("IPADDRESS: %s\n", ip_address);

    return 0;
}

サンプルラン:

./a.out -i 1234 -p 128.0.0.1
INTEGER: 1234
IPADDRESS: 128.0.0.1

./a.out -i 1234 
INTEGER: 1234

./a.out -p 128.0.0.1
IPADDRESS: 128.0.0.1

./a.out -p 128.0.0.1 -i 1234 
INTEGER: 1234
IPADDRESS: 128.0.0.1

./a.out -x stuff 
Unknown option x
于 2013-01-08T13:32:36.543 に答える
1

実際には、argv[1] と argv[2] の両方が char 配列です (つまり、char の 0 で終わる配列、別名 stringz へのポインター)。その stringz が整数または IP アドレスを表しているかどうかを知る唯一の方法は、それらを解析することです (つまり、文字列を IP アドレスまたは整数に変換します)。

argv[N] 文字列は、コマンドライン呼び出しで渡された引数を格納するために必要なだけ作成されることに注意してください。ユーザーが IP-ADDRESS 引数を指定しない場合、欠落しているのは arrgv[2] ではありませんが、引数が 1 つしかないため、単純に argv[1] が唯一の stringz になります。

基本的な考え方: それらは単なる文字列であり、ユーザーはそれらの文字列で必要なものを何でも渡すことができます。文字列を解析して意味があることを確認するのはあなたの仕事です。

于 2013-01-08T13:28:33.190 に答える
0

argv は、null で終了する文字列を持つ char* の配列です

argc を使用して、プログラムに渡された引数の数を取得できます。

if(argc == 3) // you program name is counted
{
   //if ip is here
}
else if (argc == 2)
{
   //// int is here
}

次に、IPが渡されたかどうかを確認できます。

于 2013-01-08T14:02:11.760 に答える