2011-01-06 154 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; 
}