2011-01-06 169 views
0

什麼,我正在寫很簡單,很好,也是應該的,但我發現了這個錯誤,我不知道自己還能做什麼,我的代碼看起來像這樣C++切換訪問衝突

int main() 
{ 
    char *option; 

    while(strcmp(option,"exit")!=0){ 

     int opt = GetSystemDefaultUILanguage(); 
     std::string lang; 
     switch(opt) 
     { 
      case 3082: 
        lang = "number 3082"; 
        break; 
      case 1033: 
        lang = "number 1033"; 
        break; 
     } 
     std::cout<<lang<<'\n'; 
     std::cin>>option; 
    } 

} 

當我編譯它沒有錯誤,但是當我運行它,我得到這個錯誤
項目xxxx引發異常類EAccessViolation與消息'訪問衝突地址zzzzz'.Process停止。使用「步驟」或「運行」繼續。

編輯:
這是我的全部代碼,現在更簡單,但還是同樣的結果。
即使我嘗試用if/else語句它不會工作,在這裏需要一些幫助,感謝

+2

該代碼是完全正確的。調試器在什麼情況下表示訪問衝突正在發生?您是否嘗試過編譯優化功能? – 2011-01-06 19:37:13

+1

調試器是你的朋友。 – 2011-01-06 19:44:51

回答

5

你的程序總是會得到,因爲以下線的訪問衝突:

char *option; 

while(strcmp(option,"exit")!=0){ 

std::cin>>option; 

你從不初始化指針option,但隨後嘗試使用它。你的代碼改成這樣:

int main() 
{ 
    std::string option; 

    while(option != "exit") 
    { 
     int opt = GetSystemDefaultUILanguage(); 
     std::string lang; 
     switch(opt) 
     { 
      case 3082: 
        lang = "number 3082"; 
        break; 
      case 1033: 
        lang = "number 1033"; 
        break; 
     } 
     std::cout<<lang<<std::endl; 
     std::cin>>option; 
    } 
} 
5

我不能告訴你,你所看到的具體運行時錯誤的原因,但我打電話告訴你你的程序出了什麼問題:用戶目錄的硬編碼路徑。本地化的名字只是嘗試自己猜測路徑時可能出現的各種各樣的錯誤之一。

不要這樣做。相反,請閱讀環境變量或調用Shell API以找出此特定用戶需要存儲臨時數據(或文檔,圖片,桌面圖標等)的位置。

看一看getenv("TEMP")ShGetSpecialFolderPath

0

你寫

BlockquoteProject XXXX引發的異常類EAccessViolation與消息「訪問衝突在地址zzzzz'.Process停止。使用「步驟」或「運行」繼續。

那麼爲什麼你不在程序崩潰之前暫停你的程序,去到這個位置並設置一個斷點?如果仍然不能與應付比你的代碼上傳到文件共享服務器,並給我們的聯繫;)

2

你的問題是這樣的一行:

std::cin>>option; 

變量option被聲明爲未初始化指向一個字符。因此,在上述聲明中,您正在將數據讀入未知位置。

爲什麼使用C風格字符串(char * C++ std::string? 你應該擺脫C風格的字符串(,除非它們是常量)。 試試這個:

#include <iostream> 
#include <string> 

int main(void) 
{ 
    std::string option; 
    do 
    { 
    std::cout << "Type exit to end program." << std::endl; // endl will flush output buffer 
    std::getline(cin, option); // Input a text line into "option". 
    } while (option != "exit"); // C-style string, used as a constant. 
    return 0; 
}