2012-05-09 88 views
0

然而,我對C++並不太滿意,我的代碼編譯,但該函數崩潰我的程序,下面是一個簡短的代碼總結;它不完整,但功能和呼叫在那裏。C++ ROT13函數崩潰

void rot13(char *ret, const char *in); 

int main() 
{ 
    char* str; 
    MessageBox(NULL, _T("Test 1; Does get here!"), _T("Test 1"), MB_OK); 
    rot13(str, "uryyb jbeyq!"); // hello world! 
    /* Do stuff with char* str; */ 
    MessageBox(NULL, _T("Test 2; Doesn't get here!"), _T("Test 2"), MB_OK); 
    return 0; 
} 

void rot13(char *ret, const char *in){ 
    for(int i=0; i = sizeof(in); i++){ 
     if(in[i] >= 'a' && in[i] <= 'm'){ 
      // Crashes Here; 
      ret[i] += 13; 
     } 
     else if(in[i] > 'n' && in[i] <= 'z'){ 
      // Possibly crashing Here too? 
      ret[i] -= 13; 
     } 
     else if(in[i] > 'A' && in[i] <= 'M'){ 
      // Possibly crashing Here too? 
      ret[i] += 13; 
     } 
     else if(in[i] > 'N' && in[i] <= 'Z'){ 
      // Possibly crashing Here too? 
      ret[i] -= 13; 
     } 
    } 
} 

函數進入「Test 1; Does get Here!」 - 但它沒有達到「測試2;不到這裏!」

謝謝您的高級。尼克丹尼爾斯。

回答

2

str未初始化,它在rot13中被解除引用,導致崩潰。傳遞給rot13()(無論是在疊層或動態地)之前分配內存str

char str[1024] = ""; /* Large enough to hold string and initialised. */ 

for循環內rot13()也是不正確的(infinte環):

for(int i=0; i = sizeof(in); i++){ 

變化:

for(size_t i = 0, len = strlen(in); i < len; i++){ 
0

你有幾個問題:

  • 您從不爲輸出分配內存 - 您從不初始化變量str。這是什麼導致你的崩潰。

  • 您的循環條件總是評估爲真(=分配並返回分配的值,==測試是否相等)。

  • 您的循環條件使用sizeof(in)以獲取輸入字符串的大小,但實際上會給您指針的大小。改爲使用strlen

  • 您的算法會將返回字符串中的值增加或減少13個。在輸出字符串中的值應該基於輸入字符串時,您將輸出字符串中的值與初始值相加+/- 13 。

  • 您的算法不處理'A','n'或'N'。

  • 您的算法不處理任何非字母字符,但您使用的測試字符串包含兩個。