確定Stdin
中輸入流長度的最佳方法是什麼,以便您可以使用例如getchar()
創建一個正確長度的數組來存儲它?確定必要的數組長度以存儲輸入
是否有輸入流中的所有字符偷看並使用類似的一些方法:
while((ch = readchar()) != "\n") {
count++;
}
,然後創建與大小的數組算?
確定Stdin
中輸入流長度的最佳方法是什麼,以便您可以使用例如getchar()
創建一個正確長度的數組來存儲它?確定必要的數組長度以存儲輸入
是否有輸入流中的所有字符偷看並使用類似的一些方法:
while((ch = readchar()) != "\n") {
count++;
}
,然後創建與大小的數組算?
在我鍵入代碼的時候,有幾個類似的答案。恐怕你需要做的是這樣的:
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);
在這兩種情況下,不要忘了在完成輸入之後自由輸入。
通常沒有辦法。您只能提前查看一個字符,因此如果您使用類似於您的示例中的代碼,則字符已被讀取,即使您知道它們的計數並且可以分配內存,也不能再讀取它們。 可能的策略是在開始時分配一些內存,然後在循環中如果您達到極限,則重新分配內存,使其長度加倍。
使用典型的unix文件執行此操作的一種方法是使用fseek
系統調用來確定文件的大小。不幸的是,STDIN
往往不是一個可尋求的流。
處理我知道的一般情況的唯一方法就是簡單地使用動態內存分配。你用最初的緩衝區做出最好的猜測,一旦你到達最後,他們就會創建一個新的數組,然後重新開始。處理這個過程中的錯誤是許多經典安全錯誤的開始。
你能通過命令行嗎? –
通常的做法是在讀取並填充數組時動態增長數組。這是(a)可能比讀取輸入兩次更快,以及(b)如果輸入流不可查找,則唯一方法。 (適用於所有流的代碼比可用於可搜索流的代碼更具可重用性) – Nemo
@Grijesh好的,但是假設我不想依賴用戶準確計算段落中的字符數量。 – a3onstorm