我目前使用fscanf來獲取空格分隔的單詞。我建立一個固定大小的char []來保存每個提取的單詞。我如何創建一個char []和正確數量的空格來保存一個單詞中正確數量的字符? 謝謝。掃描一個文件並分配正確的空間來容納文件
編輯:如果我在char [1000]上執行strdup並且char [1000]實際上只保存3個字符,那麼堆上的strdup預留空間是1000還是4(用於終止字符)?
我目前使用fscanf來獲取空格分隔的單詞。我建立一個固定大小的char []來保存每個提取的單詞。我如何創建一個char []和正確數量的空格來保存一個單詞中正確數量的字符? 謝謝。掃描一個文件並分配正確的空間來容納文件
編輯:如果我在char [1000]上執行strdup並且char [1000]實際上只保存3個字符,那麼堆上的strdup預留空間是1000還是4(用於終止字符)?
這裏只涉及兩筆撥款的解決方案,並沒有realloc
:
ftell
確定文件的大小。fread
將整個文件讀入它。char *
的數組能夠保存指向這個單詞的指針。而且,稍微哲學的事情:如果你想就地插入串終結和打破了一個巨大的字符串,用它作爲許多小串的這種做法是醜陋的,hackish的,等等,那麼你也許應該可能忘記使用C編程並使用Python或其他更高級語言。能夠做到這樣的更有效的數據操作操作,同時最大限度地減少潛在的故障點幾乎是任何人都應該使用C進行這種計算的唯一原因。如果你想分開分配每個單詞,那麼你只需要用C來讓自己變成一個活生生的地獄;其他語言會高興地隱藏友好字符串操作員背後的這種低效率(以及可能的失敗點)。
char *ptr;
ptr = (char*) malloc(size_of_string + 1);
char first = ptr[0];
/* etc. */
沒有一種方法。這個想法是分配一個足夠大的字符串來保存最大的字符串。讀完之後,您可以分配一個正確大小的緩衝區,並在需要時複製它。
另外,您還可以在fscanf格式字符串中指定一個寬度來限制讀取的字符數,以確保您的緩衝區永遠不會溢出。
但是,如果您分配了250個字符的緩衝區,則很難對不適合該緩衝區的單個字進行成像。
你的意思是說,你分配的'char []'對於用'fscanf()'讀的字來說不夠大? – Muggen 2011-04-13 01:32:47
'strdup()'只分配空間用到最初NUL''\ 0''並且包含它正在複製的字符串 - 所以4,在你的例子中不是1000。 – 2011-04-13 02:53:20
所以,我爲char []分配了一個大的空間。有從1到1000的字符串。我不想爲每個字符串保留1000個字節,如果它們可能只有3個字符。 – Kelp 2011-04-13 03:05:59