2013-02-08 25 views
1

我遇到了這個程序的麻煩。 編譯器給我,成功程序編譯後: 未處理的異常在「0x0f6bd540(msvcr100d.dll)」「progBUS.exe」
程序出了什麼問題,因爲一切似乎都很好,但最終,按「Enter」退出控制檯後,出現錯誤 - 給出未處理的異常。如何解決它? 非常感謝!未處理的異常 - 如何解決它,C++

# include <iostream> 
# include <cstring> 

using namespace std; 

template < class T> 
void switcher(T &a, T &b){ 
    T c=a; 
    a=b; 
    b=c; 
} 

char* f(char* word){ 
    static char* ss("u"); 
    static int iter(0); 

    cout<<"word \""<<word<<"\" has been thrown\n"; 
    if (strcmp(word,ss)!=0 && strcmp(word,"")!=0) {ss=word; iter=0;} //if another word has been thrown 
    cout<<"ss="<<ss<<" iter="<<iter<<endl; 
    static char ret[15];//return word value 
    memset(ret, '\0', 14);//clean up ret value 

    int len = strlen(ss); 
    int j=0; 
    if (iter == len-1) return nullptr;//we have reached the end of word 

    for (int i=iter;i<len;i++){ 
     //cout<<"*(ss+i)="<<*(ss+i)<<endl; 
     if (*(ss+i)!=' ') ret[j]=*(ss+i); 
     else { iter=i+1; return ret;} 
     //cout<<*(ss+i); 
     j++; 
     if(i==len-1) {iter=i+1; return ret;} 
    } 
    return nullptr; 
} 

int main(){ 
    int a=1,b=2; 

    cout<<f("fr rewfer ewr")<<endl; 
    cout<<f("fr rewfer ewr")<<endl; 
    cout<<f("43 34")<<endl; 
    cout<<f("")<<endl; 
    cout<<f("")<<endl; 
    cout<<f("fr rewfer ewr")<<endl; 
    //char ss[]("fr rewfer ewr"); 
    //size_t len = (sizeof ss)/(sizeof ss[0]); 
// cout<<"len="<<len<<endl; 

    system("PAUSE"); 
    return 0; 
} 
+3

我不明白,你開始調試並停下來使這個問題? – Rapptz

+2

'char * ss(「u」)'這應該是'const char *' –

+1

而且'char * word'也應該是'const char *'。好像你正嘗試在只讀內存中寫入。 – flamingo

回答

3

你需要一些紀律。您要使用:

f("fr rewfer ewr"); 

字符串可以在只讀存儲器中。你需要你的承諾不會改變它:

char*f(const char* word) ; 

而且你s("U");ss=word;所以你需要太:static const char* ss; 但作爲ssstatic,你需要確保的ss內容保持有效的調用之間。製作一個單詞的副本? 現在,你有ret[15]並且只有14個。爲什麼不是15?而你不能控制你可能會寫入超過14個字符。 F可以返回nullptr,但在你的主體中,你不會測試nullptr。 如果使用std::string和其他C++標準庫工具,某些問題可能會消失。

+0

你是對的!謝謝,我們不能在屏幕上輸出nullptr) –

+0

@VasiliyPetechkin:你可以輸出一個nullptr。你不能輸出它指向的內容。不要混淆這兩件事,因爲它是所有內存管理頭痛的根源 –

0

所有的問題在

cout<<f("")<<endl; 

當f retirned nullptr