2011-10-28 75 views
1

我無法使用getopt_long()函數與自定義argc和argv。getopt_long()函數與自定義argc和argv

我收到我的參數在一個字符串,而不是真正的命令行參數。然後,從這個字符串構建一個new_argc和new_argv以與getopt_long()一起使用。但getopt_long()在第一次調用時失敗。返回EOF並且optarg = NULL。

string is "-c 10.30.99.41" 
new_argc = 3 
new_argv[0]=>./prog_name 
new_argv[1]=>-c 
new_argv[2]=>10.30.99.41 

getopt_long對我有用,如果我傳遞命令行參數。所以我的短期和長期的選擇是正確的。但是,如果我通過new_argc和new_argv它失敗。

我相信我的短期和長期的選擇是正確的,argv是NULL終止。我道歉我不能在這裏發佈更多的代碼。

我懷疑getopt_long是否可以與自定義argc和argv一起使用。我懷疑它只適用於真正的argc和argv,因爲它必須引用與argc,argv相關的libc中的其他代碼。任何意見?

option = getopt_long(new_argc, new_argv, short_options, long_options, NULL); 
+1

你要發佈字符串是什麼以及它是如何用來構建列表的? – Random832

+0

正在更新帖子.. – n00pster

+0

你做錯了。 – 2011-10-28 16:17:47

回答

4

編輯:

「變量OPTIND是argv中要處理的下一個元素的索引的系統初始化該值設置爲1調用者可以將其重置爲1以重新啓動的掃描。同樣的argv,或者當掃描一個新的參數向量時。「

所以,是的。您可以使用getopt_long再次掃描參數或其他參數列表。但是,如果之前有人調用了getopt_long,則必須將全局optind變量設置回1.

請記住,main()中的argv是NULL終止的,並且是argc長; argv [argc] == NULL。所以你可能必須確保你自己的最後一個元素new_argv是一個NULL指針。

(注意,請出示全部張貼在相關的代碼,這是很難猜測是什麼錯誤,如顯示什麼short_optionslong_option是,你實際上是如何建立你的new_argv,變量聲明等)

+0

撞在頭上的男人,謝謝,非常感謝。 optind = 0或1修復它。之前使用getopt_long。 – n00pster