2010-01-07 59 views
1

我傳遞一個空的字符數組,我需要遞歸使用strcat()填充。但是,在VS調試器中,數組不是空的,它充滿了我不認識的一些奇怪的垃圾字符。 strcat()然後追加到這些垃圾字符的末尾,而不是在數組的前面。VS2008中的char []問題 - 爲什麼strcat追加到空數組的末尾?

我也嘗試過encoded[0] = '\0'在傳遞數組之前清除垃圾,但接着strcat()不會在遞歸調用中追加任何東西。

這是供應數組,並調用遞歸函數的代碼:

char encoded[512]; 
text_to_binary("Some text", encoded); 

這是遞歸函數:

void text_to_binary(const char* str, char* encoded) 
{ 
    char bintemp[9]; 
    bintemp[0] = '\0'; 

    while(*str != '\0') 
    { 
     ascii_to_binary(*str, bintemp); 
     strcat(encoded, bintemp); 
     str++; 
     text_to_binary(str, encoded); 
    } 
} 

這是怎麼回事?

ps。我無法使用std::string - 我堅持使用char*

編輯:這是數組中的垃圾字符: ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ...

+1

編碼[0] ='\ 0'應該可以工作,你在調用text_to_binary之前是否做過這個? – 2010-01-07 16:07:55

+1

「junk character」是十六進制的0xcc Debug build(在Visual C++下)使用此值初始化堆棧變量以幫助在調試時顯示未初始化的變量用法ING。 – 2010-01-07 16:21:29

回答

6

您還沒有初始化數組。變化:

char encoded[512]; 

char encoded[512] = ""; 
3

strcat的附加到字符串的末尾,端部由一個\ 0標記,則它附加一個\ 0到新的結束位置。

您應清除編碼爲[0] = 0的目標;或memset首先。

2

char encoded[512]; .. encoded未初始化並且將包含垃圾(或調試版本中的0xCCCCCCCC)。

+1

調試堆使用'0xcd'。 '0xcc'用於堆棧上未初始化的變量。 – 2010-01-07 16:24:27

+1

所有非常特定的編譯器。如果你提到這個細節,同時提到編譯器和操作系統。 – 2010-01-07 17:24:47

+0

我的歉意。 Andreas的回答和我的評論都是針對Microsoft Visual C++調試運行時(至少從Visual Studio 2005開始)。 – 2010-01-07 18:46:15

1

你的問題是由於我認爲編碼初始化。關於你的程序的幾點評論:

最好避免遞歸 函數,當你可以用 循環做到這一點。

其次你應該添加的 編碼,以避免可能的溢出 誤差的大小(在案件串 的大小比編碼更大)。

void text_to_binary(const char* str, char* encoded) 
{ 
    char bintemp[9]; 
    bintemp[0] = '\0'; 
    encode[0] = '\0'; 

    for(const char *i = str; i!='\0'; i++) 
    { 
     ascii_to_binary(*i, bintemp); 
     strcat(encoded, bintemp); 
    } 
} 

PS:我沒有試過源代碼,所以如果出現錯誤,請添加註釋,我會更正它。

您的項目的良好延續。

+0

是的,謝謝,我知道所有這些,這只是一個簡單的例子 – tgh 2010-01-07 16:18:11

1

解決您的眼前問題已經發布,但您的text_to_binary仍然效率低下。你基本上在呼叫strcat的循環中總是要連接到相同的字符串,並且strcat需要遍歷字符串以找到它的結尾。這使得你的算法是二次的。你應該做的是自己跟蹤encoded的結尾,並將bintemp的內容直接放在那裏。一個更好的方式來寫循環將

while(*str != '\0') 
{ 
    ascii_to_binary(*str, bintemp); 
    strcpy(encoded, bintemp); 
    encoded += strlen(bintemp); 
    str++; 
} 

你不需要遞歸,因爲你已經在str循環(我相信這是正確的,因爲你原來的代碼將填充encoded非常古怪)。此外,在修改後的版本中,encoded始終指向原始encoded字符串的末尾,因此您可以僅使用strcpy而不是strcat

0
  1. 你沒有連接ascii_to_binary的來源,讓我們假定它會填滿緩衝區的字符的十六進制轉儲(如果這是它更容易使用sprintf(encoded+(i2),"%2x",*(str+i));
  2. 的情況下什麼是遞歸調用text_to_binary點?我認爲這可能是一個問題
相關問題