2013-08-12 26 views
2

我試圖模擬main()函數使用字符串標記化和存儲標記在NULL終止的char*數組中的正常函數的行爲。使getopt()進程argv [0]

getopt()之外的每件事情都很好。它不會重新排列argv[0]因爲它期望第一個參數是程序名。但對於我的功能argv[0]不是程序名稱。我想讓getopt()也重新排列argv[0](非選項)。我怎麼做?

+0

爲什麼你想這樣做?這是濫用'getopt()'。 – alk

回答

0

使用

c = getopt(argc + 1, argv - 1, "xyz") 

編輯嘗試:其中,如下面指出的那樣,是一個黑客,但我很想看到一臺機器上,它沒有工作。

+0

@Tom坦納那工作:) – tez

+0

我傾向於說'argv - 1'引用未定義的行爲。所以我認爲這個解決方案是一個骯髒和不可移植的黑客攻擊。 – alk

+0

只有當你訪問它。我懷疑getopt的確如此, –

2

getopt(3)使用全局變量optind(選擇指數)來跟蹤其進展情況通過argv,並將其初始化1.嘗試讀取選項之前設置optind = 0

+0

是的,我試過這樣做。在第一次調用getopt()之前,我已經設置了optind = 0。不起作用。 – tez

+0

結果是什麼? – chrylis

+0

即使在設置optind = 0後,結果也是一樣的。argv [0]元素位於相同的地方 – tez

0

雖然hack @Tom Tanner建議爲某些系統工作,但它並未針對我應該使其工作的目標進行編譯。我找到的另一個解決方法是用虛擬字符串替換argv []數組中的第一個參數,並使用getopt()。