2017-01-10 39 views
1

我想讀的ANSI格式的文件,並轉換這binary.I'm聲明兩個動態內存分配是這樣的:char* binary_reverse = new char;char * binary = new char;新的聲明包含垃圾值和堆腐敗而使用delete

雖然調試我看到這(二進制)包含太多的垃圾值。爲什麼這樣?

我正在刪除這些:delete binary_reverse;刪除二進制; 然而,在刪除其給我的錯誤:

'ASCIItoBinary.exe': Loaded 'D:\TryingBest\Reactice\ASCIItoBinary\Debug\ASCIItoBinary.exe', Symbols loaded. 'ASCIItoBinary.exe': Loaded 'C:\Windows\SysWOW64\ntdll.dll', Cannot find or open the PDB file 'ASCIItoBinary.exe': Loaded 'C:\Windows\SysWOW64\kernel32.dll', Cannot find or open the PDB file 'ASCIItoBinary.exe': Loaded 'C:\Windows\SysWOW64\KernelBase.dll', Cannot find or open the PDB file 'ASCIItoBinary.exe': Loaded 'C:\Windows\SysWOW64\msvcr100d.dll', Symbols loaded. HEAP[ASCIItoBinary.exe]: Heap block at 00241ED0 modified at 00241EFD past requested size of 25 Windows has triggered a breakpoint in ASCIItoBinary.exe.

這裏是我正在做代碼:

#include <cstring> 

void AtoB(char * input) 
{ 
    unsigned int ascii; //used to store ASCII number of a character 
    unsigned int length = strlen(input); 
    //cout << " "; 
    for (int x = 0; x < length; x++) //repeat until the input is read 
    { 
     ascii = input[x]; 
     char* binary_reverse = new char;  //dynamic memory allocation 
     char * binary = new char; 
     //char binary[8]; 
     int y = 0; 
     while (ascii != 1) 
     { 
      if (ascii % 2 == 0) //if ascii is divisible by 2 
      { 
       binary_reverse[y] = '0'; //then put a zero 
      } 
      else if (ascii % 2 == 1) //if it isnt divisible by 2 
      { 
       binary_reverse[y] = '1'; //then put a 1 
      } 
      ascii /= 2; //find the quotient of ascii/2 
      y++; //add 1 to y for next loop 
     } 
     if (ascii == 1) //when ascii is 1, we have to add 1 to the beginning 
     { 
      binary_reverse[y] = '1'; 
      y++; 
     } 

     if (y < 8) //add zeros to the end of string if not 8 characters (1 byte) 
     { 
      for (; y < 8; y++) //add until binary_reverse[7] (8th element) 
      { 
       binary_reverse[y] = '0'; 
      } 
     } 

     for (int z = 0; z < 8; z++) //our array is reversed. put the numbers in the rigth order (last comes first) 
     { 
      binary[z] = binary_reverse[7 - z]; 
     } 
     //printf("the Binary is %s",binary); 
     //cout << binary; //display the 8 digit binary number 

     delete binary_reverse;  //free the memory created by dynamic mem. allocation 
     delete binary; 
    } 
} 

我想在「二進制」的準確的二進制值。不是垃圾的二進制值?如何消除垃圾值?如何避免堆腐敗?

+1

'char * binary_reverse = new char; ''和'char * binary = new char;' - 所以你分配1個字節用於存儲 – RbMm

+0

關閉主題:保存一些代碼:'else if(ascii%2 == 1)'可以只是'else'。當處理一個單一的二進制位時,它的值將是1或0.如果它不是一個,它必須是另一個。 – user4581301

回答

1

問題是,您正在爲new char命令分配一個字符。你想分配更多,使用new char[9]。由於您最多打印了8位,因此您需要爲空終止符添加一個額外的字符。請務必在字符串的末尾設置binary_reverse[y]=0

然後delete[]而不是delete

雖如此,但你應該使用std::stringstd::vector,而不是...

+0

我試過了。像新的字符[8]和刪除[],它仍然有相同的問題 – AskMe

+0

你發佈的內容將永遠不會工作,所以你應該發佈一些有工作機會的東西(即用'new char [8]')。 –

+0

我已經更新了答案。你需要在你的字符串末尾有一個空終止符。 –

1

原來有錯位置了一堆東西幾乎所有的人,從不會終止輸出字符串,然後OFFF航向幹在錯誤的方向尋找修復。

我會忽略錯誤

只是說OP需要更多的存儲

char* binary_reverse = new char[8]; 

正確的做法是回到它看起來像OP開始,並添加一個額外的字節包含字符串的空終止臨時分配。然後使用該空間作爲空終止符。

沒有空終止符,您沒有字符串。你有一個二進制的blob。打印例程(所有c風格的字符串例程)都依賴於那個終結器。沒有它,他們不知道字符串結束的地方,然後進入尋找它的野生藍色的那邊。經常發生壞事。或者,也許它不。當你走出一個數組的時候會發生什麼是未定義的。也許它做你想做的。也許它沒有。沒辦法確定。在這種情況下,從軌道上刪除站點甚至不起作用。

所以分配臨時存儲:

char binary_reverse[8]; // not using this one like a string so we don't need a terminator 
char binary[9]; // printing this one. Need a terminator to know when to stop printing. 

後來binary_reverse構造,然後轉移到binary後,binary需要終止成爲一個字符串,而不是隻是一個匿名的二進制BLOB。

binary[8] = '\0'; 

現在可以打印了。

建議:

Visual Studio有一個很棒的調試器。熟悉它。節省你很多時間。

如果OP沒有評論出打印語句的可能性是好的,那麼昨晚人們會發現主要的bug。儘量減少代碼是好的,但OP刪除了錯誤的可見表現。

此代碼可以大大簡化。你知道你需要8位,因爲你在ascii中工作(呃,實際上ascii是7位,但除了8位以外很少見到任何東西)。將while (ascii != 1)轉換爲for (int count = 0; count < 8; count++)並測試字符中的所有8位。稍後保存你幾圈,因爲現在你總是得到8位。

+0

仍然遇到這兩個問題。任何人都試圖在VS中寫同樣的東西,並能成功運行? – AskMe

+0

@TryingBest全部重寫答案。 – user4581301