2014-04-22 83 views
0

我寫了兩種方式的代碼 試圖在Visual Studio 2012中運行 - 我打開項目作爲簡單的控制檯應用程序,我得到訪問權限評估異常。爲什麼我的簡單反向字符*不起作用?

代碼1

void revReq(char* str) 
{ 
    if(*(str+1) != '\0') 
      revReq(str+1); 
    putchar(*str); 
} 

代碼2

void rev(char* str) 
{ 
char* retVal = new char[strlen(str)]+1; 

char* ptr = str + strlen(str)-1; 
int i = 0; 
while(ptr != str) 
{ 
    retVal[i++]=*ptr; 
    *ptr = '\0'; 
    ptr--; 
} 
} 

的inpus是

char* n = "abcdef"; 
revReq(n); 

異常

在0x00B11E7C在Ex003.exe未處理的異常:0000005:訪問違規讀取地址0xFFFFFFFF。

+1

內存分配過程中不忘記加上'+ 1'爲空終止 –

+0

你爲什麼忽略了整個標準庫? 'std :: reverse(str,str + strlen(str)-1);'。使用'std :: string'更好。 –

+0

這是學術實踐...我不想使用 ... – Yanshof

回答

2

在你比較指針海峽與「字符加1第一個函數的大小\ 0'僅當char等於signed char且* str的內部代碼等於255(-1)時,條件纔可以等於true。

void revReq(char* str) 
{ 
    if((*str+1) != '\0') 
      revReq(str+1); 
    putchar(*str); 
} 

有效的代碼看起來

void revReq(const char *s) 
{ 
    if(*str) 
    { 
      revReq(str + 1); 
      putchar(*str); 
    } 
} 

第二個功能也是錯誤的。至少你必須寫的

char* retVal = new char[strlen(str) + 1]; 

代替

char* retVal = new char[strlen(str)]+1; 

也有一個內存泄漏。該函數必須返回反轉的字符串。

有效的代碼將如下

char * rev(const char *s) 
{ 
    size_t n = strlen(s); 
    char *p = new char[ n + 1]; 

    const char *s1 = s + n; 
    char *q = p; 

    while (s1 != s) *q++ = *--s1; 
    *q = '\0'; 

    return p; 
} 
+0

T H A N K S !!!! – Yanshof

2

使用strlen(STR)+ 1 的strlen函數返回字符串不包括空字符「\ 0」

+0

添加這個 - 仍然有同樣的問題。 – Yanshof

+1

@Yanshof:你需要'[]'裏面的'+ 1'。 –

相關問題