2012-06-08 230 views
1
openFile(argv[1],"r"); 
while(characterBuff != EOF) 
{ 
    characterBuff = fgetc(examFile); 
    memoryAlloc += 1; 
    string = expandRealloc(string, memoryAlloc); 
    appendString(string, characterBuff); 
    printf("%s\n", string); 
} 
closeFile(); 
free(string); 

在下面的代碼:我是從得到的printf的輸出給了我喜歡[somehash] d [somehash] E [somehash] S [somehash]ķ打印文件的內容

ackward值我得到的輸出字是「DESK」,但是從內存中取出所有類型的隨機垃圾,我做錯了什麼?

注意:以下內容已分配給malloc(sizeof(char)),並在每次將單個字符添加到字符串時進行實時定位。

即輸出我應該得到應爲: d 德 德 臺的 而是說我得到我之前所示的U的事情。

編輯:

char* expandRealloc(char* ptrS, size_t n) 
{ 
    void *tmp; 
    if((tmp = realloc(ptrS, n)) == NULL) 
    { 
     printf("Error: Memory leak possible; Closing Program"); 
     exit(EXIT_FAILURE); 
    } 
    else 
    { 
     ptrS = tmp; 
     return ptrS; 
    } 
} 

我寫了一個包裝功能的realloc。感謝您的幫助,但它仍然不能解決問題,當嘗試打印結果時,我仍然得到[somecrapmemoryhash] [letter] [somecrapmemoryhash] [letter]。

置字符串:

void appendString(char* inputString, int inputChar) 
{ 
    int stringLenght = strlen(inputString); 
    inputString[stringLenght - 1] = inputChar; 
    inputString[stringLenght] = '\0'; 
} 
+0

我想這是C/C++? –

+0

是的,它是C,忘了添加 –

+3

開始的一個大問題 - 你的realloc調用中斷 - 查看realloc的手冊頁 –

回答

4

realloc被調用時,它可以移動分配的內存,所以你需要通過realloc的返回值來代替指針的舊內容。

嘗試

char *temp_string; 
    . 
    . 
    . 
temp_string = realloc(string, memoryAlloc); 
if(temp_string != NULL) 
    string = temp_string; 

編輯

這令我更加這裏的問題是使用的用戶編寫的函數做事情早就有標準的一部分圖書館。修改此代碼以使用標準庫函數而不使用特殊的包裝器等,不會更困難,並且會導致更高的可靠性。作爲一個例子,appendString函數似乎是這裏遇到的很多困難的來源。如果使用strcat函數(對於源代碼使用較小的mod),則可以避免大量的惡化和拉毛。

標準庫出於很好的理由。它是一致的,穩定的,調試的,有用的,而且 - 這是標準。如果有人認爲他們本身比爲標準庫貢獻力量的數百人更聰明,他們很可能是錯誤的。如果某人認爲他們不可能使用標準庫中的函數來執行基本操作,因爲他們的需求非常特別,他們很可能是錯誤的。 C語言本身並不特別特別 - 讓我們面對它吧,大括號並不是什麼大不了的事情:-) C的力量直接來自於「把所有東西放在一個函數中」的哲學 - 即從使用的函數庫來完成任務。標準庫是C程序員需要學習的最基本的東西,對於任何有經驗的C程序員來說,它的使用應該是第二天性的。

分享和享受。

+0

雖然如果realloc失敗(即返回NULL),這會導致內存泄漏 - 您應該首先將realloc的結果分配給臨時指針。 –

+0

@PaulR - 好點 - 改變的例子。 –

+0

寫了一個realloc的包裝函數,並對其進行了修改,但它仍然無法解決打印問題,這對我來說是一個問題。代碼的內容反映到第一篇文章中。 –

0

您的字符串打印問題看起來像是缺少NULL終止在您的字符串末尾...... appendString照顧添加終止符?

+0

是的,它增加了一個終結者。請注意,我的問題是不打印:DESKfo0932jfjewf98wjef98wejf等但D [Psunflowersign] E [Psunflowersign]等 –

2

appendString功能是錯誤的 - 變化:

void appendString(char* inputString, int inputChar) 
{ 
    int stringLenght = strlen(inputString); 
    inputString[stringLenght - 1] = inputChar; 
    inputString[stringLenght] = '\0'; 
} 

到:

void appendString(char* inputString, int inputChar) 
{ 
    int stringLength = strlen(inputString); 
    inputString[stringLength] = inputChar; 
    inputString[stringLength + 1] = '\0'; 
} 
+0

而我仍然得到[字符串的開始[怪異記憶] [ –

+0

]你是如何初始化字符串?你也需要發佈這個部分的代碼。 –