1

プログラムに「execvp(argv[1],argv+1);」を実現させたかったのです。最初の引数が未定義の場合、getopt は "-" で始まるすべての引数を解析します。最初の未定義の引数の後のすべての引数を無視するには? これは getopt を使用して可能ですか? 現在、私はコードを持っています:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <string.h>
void print_usage() {
     printf("Usage: here print usage\n");
}

int main(int argc, char *argv[]) {
    int option = 0;
char user[32]={0}, command[50]={0};
while ((option = getopt(argc, argv,"c:u:h")) != -1) {
    switch (option) {
         case 'c' : strcpy(command,optarg);
             break;
         case 'u' : strcpy(user,optarg);
             break;
         case 'h' : print_usage();
                    exit(EXIT_SUCCESS);
             break;
         default:
             print_usage();
             exit(EXIT_SUCCESS);
    }
}

if(strlen(user)!=0) {
    if (strlen(command)!=0)
        printf("execute %s for %s\n",command,user);
    else
        printf("please specify command\n");
}
else {
    if (strlen(command)!=0)
        printf("please specify user\n");
    else if (argc > 2)
         printf("execute %s for everyone\n",argv[1]);

}

return 0;

}

あなたが実行すると、私は得ました:

./thisprogram ls -l
./thusprogram: invalid option -- 'l'

私はこのようにしたいと思います。

./thisprogram ls -l /
razem 52
lrwxrwxrwx   1 root root     7 05-31 20:40 bin -> usr/bin
drwxr-xr-x   5 root root  4096 10-21 22:44 boot
drwxr-xr-x  19 root root  3160 11-02 17:10 dev

などなど・・・ですが、わかりません。

4

1 に答える 1

4

不明な引数に遭遇したら、解析を停止してください。

int done = 0;
while (!done && (option = getopt(argc, argv,"c:u:h")) != -1) {
    switch (option) {
     ...
    default:
        done = 1;
        break;
   }
}

(または、getopt が未知の引数に遭遇したときに '?' を返すので、必要に応じcase '?':て大文字と小文字の代わりに使用します)default:

于 2013-11-02T22:35:35.330 に答える