2011-04-13 62 views
1

我目前使用fscanf來獲取空格分隔的單詞。我建立一個固定大小的char []來保存每個提取的單詞。我如何創建一個char []和正確數量的空格來保存一個單詞中正確數量的字符? 謝謝。掃描一個文件並分配正確的空間來容納文件

編輯:如果我在char [1000]上執行strdup並且char [1000]實際上只保存3個字符,那麼堆上的strdup預留空間是1000還是4(用於終止字符)?

+0

你的意思是說,你分配的'char []'對於用'fscanf()'讀的字來說不夠大? – Muggen 2011-04-13 01:32:47

+0

'strdup()'只分配空間用到最初NUL''\ 0''並且包含它正在複製的字符串 - 所以4,在你的例子中不是1000。 – 2011-04-13 02:53:20

+0

所以,我爲char []分配了一個大的空間。有從1到1000的字符串。我不想爲每個字符串保留1000個字節,如果它們可能只有3個字符。 – Kelp 2011-04-13 03:05:59

回答

1

這裏只涉及兩筆撥款的解決方案,並沒有realloc

  1. 尋求到年底,並使用ftell確定文件的大小。
  2. 分配一個這樣大小的內存塊,並使用fread將整個文件讀入它。
  3. 計算此塊中的字數。
  4. 分配一個char *的數組能夠保存指向這個單詞的指針。
  5. 再次遍歷文本塊,爲每個指針指定一個單詞開頭的地址,並用0(空字符)替換單詞末尾的單詞定界符。

而且,稍微哲學的事情:如果你想就地插入串終結和打破了一個巨大的字符串,用它作爲許多小串的這種做法是醜陋的,hackish的,等等,那麼你也許應該可能忘記使用C編程並使用Python或其他更高級語言。能夠做到這樣的更有效的數據操作操作,同時最大限度地減少潛在的故障點幾乎是任何人都應該使用C進行這種計算的唯一原因。如果你想分開分配每個單詞,那麼你只需要用C來讓自己變成一個活生生的地獄;其他語言會高興地隱藏友好字符串操作員背後的這種低效率(以及可能的失敗點)。

0
char *ptr;  
ptr = (char*) malloc(size_of_string + 1); 

char first = ptr[0]; 
/* etc. */ 
0

沒有一種方法。這個想法是分配一個足夠大的字符串來保存最大的字符串。讀完之後,您可以分配一個正確大小的緩衝區,並在需要時複製它。

另外,您還可以在fscanf格式字符串中指定一個寬度來限制讀取的字符數,以確保您的緩衝區永遠不會溢出。

但是,如果您分配了250個字符的緩衝區,則很難對不適合該緩衝區的單個字進行成像。