2011-11-07 54 views
2

在C,我們做這樣的事情:獲取輸入字符串到一個數組用C

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

printf("The first argument is %s", argv[1]); 
printf("The second argument is %s", argv[2]); 
return 0; 

} 

我想知道是否有可能存儲字符串中類似的方式數組作爲上述使用scanf或與fgets時。

我想這樣的:

char **input; 
scanf("%s", &input); 

反正我可以訪問輸入爲輸入[0],輸入字符串[1] ...等等...

+0

想要問這兩天以來。 :P最後,別人做了。謝謝 –

回答

3

是的,但你需要確保你有足夠的空間可以這樣做:

char input[3][50]; // enough space for 3 strings with 
        // a length of 50 (including \0) 

fgets(&input[0], 50, stdin); 
printf("Inputted string: %s\n", input[0]); 

使用char **input沒有爲輸入分配任何空間,因此你不能這樣做。

+0

假設我們有三個詞作爲輸入輸入,按空格分隔。我想將這三個單詞存儲在數組中。可以有任何數量的單詞..我想訪問這些單詞,就像我們訪問傳遞給main()的參數一樣。我相信在你的榜樣上面輸入的一切都存儲在輸入[0] – suenda

3

這是可能的,但有點乏味,特別是如果你不知道字符串開頭的數量。

char **input; 

這很好。從那裏,則需要分配的陣列(權數)的指針:

input = malloc(sizeof(char *) * MAX_LINES); 

然後,你需要爲每個線分配空間。既然你通常只需要每串有足夠的空間,你通常做這樣的事情:

#define MAX_LINE_LEN 8192 

static char buffer[MAX_LINE_LEN]; 
long current_line = 0; 

while (fgets(buffer, sizeof(buffer), infile) && current_line < MAX_LINES) { 
    input[current_line] = malloc(strlen(buffer)+1); 
    strcpy(buffer[current_line++], buffer); 
} 

如果你不知道排隊,前面的號碼,你通常分配多個指針的下手(大概如上),但是當你閱讀每一行時,檢查你是否已經超出了當前的分配,並且你是否重新分配了指針數組以獲得更多空間。

如果你想足夠糟糕,你可以對每條線做同樣的事情。在上面,我簡單地設置了一個最大值,足夠大的話,你可能不會經常使用最常見的文本文件。如果你需要更大的尺寸,擴展它非常容易。同時,您挑選的任何數字都是任意限制。如果你願意,你可以在你的緩衝區中讀取一個塊,如果字符串中的最後一個字符不是換行符,請繼續閱讀更多的相同字符串(並且再次使用realloc根據需要擴展分配) 。這並不難,但是正確地覆蓋所有角落的情況可能會很乏味。

編輯:我應該補充說,有一個相當不同的方式來獲得相同的基本效果。將文件的全部內容讀入一個單獨的大緩衝區,然後(通常)使用strtok將緩衝區分成多行(用\「\ n」替換「\ n」)以在緩衝區中構建一個指針數組。這通常會提高速度(一個大的讀取而不是多個單行讀取)以及分配開銷,因爲您使用一個大的分配而不是許多小的分配。每個分配通常都會有一個標題,並被舍入爲(2的冪數)的一個。這種影響隨着所涉及的線路長度而變化。如果你有幾條很長的路線,那可能沒什麼關係。如果你有很多短線路,它可以節省lot

+0

非常感謝回覆。我實際上正在嘗試開發類似bash的東西,它可以運行程序,腳本和管理變量。用戶輸入命令,然後輸入參數。我試圖訪問通過數組輸入的所有字符串。在你上面的例子中,我相信你假設字符串像一個文本文件一樣大。看起來對於我的情況,我需要先讀取緩衝區中的字符串,然後使用空格作爲分隔符。將字符串分開並通過動態定義將其存儲在數組中。有沒有其他的選擇? – suenda

+0

不應該'currentline Dmitri

+0

@suenda:是的,我將您提到的scanf和fgets解釋爲表示您正在計劃從文件讀取輸入。如果你對命令行參數感興趣,那麼你可以通過'argv [1]'...'argv [argc-1]'來讀取。 –

相關問題