1

我想給幾個參數在命令行中,就像當:分段故障嘗試檢查命令行參數(在C)

./programName -a 103 -p argument1,argument2,argument3 

然後,我想用這些參數值創建幾個變量:在標誌-a後面的數字的一個整數變量,緊接在標誌-p後面的參數數量的一個整數變量以及具有所有這些參數的一個數組變量。

這將是永遠相同的參數(所以我的代碼無法管理其他形式的輸入):-a(整數)-P(與分割的參數列表)

我的問題是,有分段故障。經過多次嘗試以查看它發生的位置(使用多個printf),當變量a = 3時(因此在標誌-p處)出現分段錯誤。分割發生在「case'p'」這一行。

我不明白爲什麼這段代碼接受參數「-a」而不是「-p」。而且我認爲沒有錯誤,因爲我的代碼在「case'p'」中,因爲分段錯誤發生在那之後(在「case'p'」一行)。

我希望你能理解我的問題,謝謝你的幫助:)。

編輯:

感謝馬克·威爾金斯和OOGA了他們的答案。分段錯誤確實是由於未初始化的數組中的單個元素造成的。 如果有些人不知道如何有效地初始化字符串數組,檢查該另一個問題,它很好地解釋):

Initialize array of strings

+1

你確定你使用'char * chrp = argv [p + 1];'?因爲沒有p定義... – Doberman

+0

當代碼執行'number_a = strtol(argv [a + 1],NULL,10);',它不知道'argv [a + 1];'不是NULL。也許使用'for(; a <(argc-1);)' – chux

+0

還沒有完成,但你的休息應該超出花括號? – Nikole

回答

1

會導致分段錯誤的一個問題是使用arg_p。它被聲明爲char*的一個數組,但是數組的單個元素永遠不會被初始化。隨後使用它將導致訪問未初始化的指針:

*(arg_p[b]+c) = *(chrp+c); 
0

當你增加「一個」 2,你會去掉argv數組的末尾。您只想增加1,因爲它將索引命令行中的單詞(用空格分隔)而不是字符索引。

+0

但他的選擇是單獨的話。 – ooga

+1

沒錯 - 他每次解析一個單詞時都會將'a'(單詞的索引)遞增2。 – dma

+0

每次他解析*兩個單詞時,我都認爲它增加了2。 – ooga

1

您的段錯誤在組裝您的參數數組時發生。試試這個:

arg_p[0] = chrp; 
    chrp2 = strchr(argv[a+1], ','); 
    int b = 1; 
    while (chrp2 != NULL) { 
     *chrp2 = '\0'; 
     arg_p[b++] = chrp2 + 1; 
     chrp2 = strchr(chrp2 + 1, ','); 
    } 

另外請注意,您arg_p數組局部聲明該塊將停止該塊後存在。你可能想要聲明一個char** arg_p指針和malloc空間。記得在最後解放它。

+0

澄清:這是有效的,因爲'argv [i]'指向的字符串是可寫的;和OP代碼失敗,因爲正在使用'arg_p [b]',一個未初始化的指針。 'arg_p []'數組中的指針都需要指向某處; ooga的解決方案已經將它們指向了'argv'數組中的實際參數,用逗號結束標記替換逗號。這比分配新空間更簡單。 –