一般來說,我對動態記憶體分配很陌生。在過去的 3 天里,我一直在尋找這段代碼中的錯誤大約 6 個小時,這讓我發瘋,這就是我決定在這里尋求幫助的原因。這是代碼:
char ch;
char* line=(char*)calloc(1, sizeof(char));
if(input!=NULL) {
for(int num=1; (ch=fgetc(input)) != EOF; num ) //input is the pointer to the in file
if(ch!=' ') {
line=(char*)realloc(line, sizeof(char)*num 1);
strcat(line, &ch);
}
else
break;
}
我正在嘗試從檔案中讀取兩個以空格分隔的單詞中的第一個,其中總大小不是預先確定的(我需要這個從檔案中讀取更多內容,所以這很重要,這是“只是為了嘗試”) . 這是針對單行,而不是多行(我認為在這種情況下會使用 char**),其想法是分配行的第一個字符并將其設定為零,然后重新分配記憶體,使其大小增加一個字符。如果我“num ”,它會崩潰;如果我不這樣做,它的輸出將不是“Nole”,而是:N?o?l?e?(輸出在回圈;如果 num 保持不變,它甚至會如何增加?)。我檢查了 ASCII 碼,這是我得到的:78 1 111 1 108 1 101 1;每個字符后面都有一個“1”,它與“num”的值相同(實際上,如果 num==2,那么我得到的是 '2' 而不是 '1')。我用不同的編譯器和不同的機器嘗試過,但我總是得到相同的結果,我無法解釋為什么。我真的快瘋了,也是因為我將在大約兩周后參加考試,而這基本上是我在所有必修課中唯一還沒有學過的東西。
提前非常感謝你??
uj5u.com熱心網友回復:
EOF是一個int所以你必須使用int ch;正如評論中提到的,你傳遞一個單一
ch的 tostrcat而不是一個空終止的字串,所以它會變得混亂。快速修復:strcat(line, (char[2]){ch,'\0'});。或者,如果您添加一個計數器,您可以這樣做
line[count] = ch;效率更高。盡管在這種情況下,您必須記住在最后手動附加空終止符。
此外,sizeof(char)根據 的定義,它始終為 1 sizeof,因此它只是一種不必要的臃腫的書寫方式1。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/492368.html
下一篇:根據Ruby中的哈希鍵計算陣列
