2011-10-12 120 views
-1

任何人都可以向我解釋爲什麼im得到一個「.exe遇到問題,需要關閉」的錯誤,它編譯和工作有時當我擺弄char數組,但是當它確實工作,我有時會變得奇怪字符串末尾的字符。字符串反向錯誤

#include <iostream> 
using namespace std; 
char* StrReverse3(char*); 
char* StrReverse3(char* str) 
{ 
    char *p; 

    int length=0,start=0,end=0; 
    length=strlen(str); 

    for(start=0,end=length-1;end>= 0,start<=length-1;end--,start++) 
    { 
     p[start]=str[end]; 
    } 


    return p; 
} 
int main() 
{ 
    char str[100]="Saw my reflection in snow covered hills"; 
    StrReverse3(str); 

cin.get(); 
return 0; 
} 
+0

這也是由四通串錯了.... –

+0

那不是我的什麼輸出告訴我 – user954004

+0

你說得對你的輸出中的「段錯誤」 –

回答

6

您沒有初始化p。這是一個未初始化的指針,您正在寫入。

既然你是用C++寫這個,不是C,我建議使用std::stringstd::reverse

#include <string> 
#include <algorithm> 
#include <iostream> 

int main() 
{ 
    std::string str = "Saw my reflection in snow covered hills"; 
    std::reverse(str.begin(), str.end()); 
    std::cout << str; 
    return 0; 
} 

輸出:

 
sllih derevoc wons ni noitcelfer ym waS 

看到它ideone

3

聯機工作char *p;從不初始化,但p[start]被用作賦值的目的地。你沒有從這個編譯器警告?我甚至驚訝它甚至「有時候有效」。

+0

這可能是他看到的隨機垃圾。 –

0

您正在訪問未被程序分配的內存(p可指向任何位置!)。這是你遇到問題的原因。

我強烈建議您

  • 讀入新的動態分配內存的話題,並刪除明白一個非常重要的話題
  • 讀入標準模板庫,特別的std :: string。你不應該使用像char *這樣的原始指針,在可能的時候總是使用標準類型。
0
#include <iostream> 
#include <cstring> 

using namespace std; 

char* StrReverse3(char* str){ 
    int length=0,start=0,end=0; 
    length=strlen(str); 

    for(start=0,end=length-1;end > start;end--,start++){ 
     char temp; 
     temp = str[start]; 
     str[start]=str[end]; 
     str[end]=temp; 
    } 

    return str; 
} 
int main(){ 
    char str[100]="Saw my reflection in snow covered hills"; 
    cout << StrReverse3(str); 
    cin.get(); 
    return 0; 
}