2014-01-25 52 views
3

確定Stdin中輸入流長度的最佳方法是什麼,以便您可以使用例如getchar()創建一個正確長度的數組來存儲它?確定必要的數組長度以存儲輸入

是否有輸入流中的所有字符偷看並使用類似的一些方法:

while((ch = readchar()) != "\n") { 
    count++; 
} 

,然後創建與大小的數組算?

+0

你能通過命令行嗎? –

+1

通常的做法是在讀取並填充數組時動態增長數組。這是(a)可能比讀取輸入兩次更快,以及(b)如果輸入流不可查找,則唯一方法。 (適用於所有流的代碼比可用於可搜索流的代碼更具可重用性) – Nemo

+1

@Grijesh好的,但是假設我不想依賴用戶準確計算段落中的字符數量。 – a3onstorm

回答

4

在我鍵入代碼的時候,有幾個類似的答案。恐怕你需要做的是這樣的:

int size = 1; 
char *input = malloc(size); 
int count = 0; 
while((ch = getchar()) != '\n') { 
    input[count++] = ch; 
    if (count >= size) { 
     size = size * 2; 
     input = realloc(input, size); 
    } 
} 
input[count++] = 0; 
input = realloc(input, count); 

或者您可以使用相同的POSIX庫函數getline()。即

int count, size; 
char *input = NULL; 
count = getline(&input, &size, stdin); 

在這兩種情況下,不要忘了在完成輸入之後自由輸入。

+0

+1。對於生產實現,當然,你需要檢查所有調用返回給'malloc'和'realloc',以確保它們不是NULL。此外,該實現允許在輸入中使用NULL字符,這使得難以可靠地解釋結果... – Nemo

+0

非常感謝!我只是開始C,所以我必須正確地學習所有這些指針。快速提問:爲什麼你需要添加額外的0?爲什麼你不能直接在循環後輸入= realloc(input,count)? – a3onstorm

+0

並非真的需要。然而,它有雙重效果,你可以在'input'上使用所有與字符串相關的函數,並且最後一行的count!= 0。 – Marian

0

通常沒有辦法。您只能提前查看一個字符,因此如果您使用類似於您的示例中的代碼,則字符已被讀取,即使您知道它們的計數並且可以分配內存,也不能再讀取它們。 可能的策略是在開始時分配一些內存,然後在循環中如果您達到極限,則重新分配內存,使其長度加倍。

0

使用典型的unix文件執行此操作的一種方法是使用fseek系統調用來確定文件的大小。不幸的是,STDIN往往不是一個可尋求的流。

處理我知道的一般情況的唯一方法就是簡單地使用動態內存分配。你用最初的緩衝區做出最好的猜測,一旦你到達最後,他們就會創建一個新的數組,然後重新開始。處理這個過程中的錯誤是許多經典安全錯誤的開始。