【问题标题】:C++ Borland char * and strcpyC++ Borland char * 和 strcpy
【发布时间】:2011-12-17 19:55:22
【问题描述】:
char *dum[32];
strcpy(&dum,InstList->Lines->Text.c_str());

InstList 是 C++ Builder 的 TMemo

为什么会出现这个错误?

[C++ 错误] emulator.cpp(59): E2034 无法将 'char * *' 转换为 'char *' 完整的解析器上下文 emulator.cpp(56): 解析: void _fastcall TMain::Button1Click(TObject *)

【问题讨论】:

    标签: c++ c++builder strcpy


    【解决方案1】:

    您要么使用(容易出现严重的安全问题,称为缓冲区溢出

    char dum[32];
    strcpy(dum,InstList->Lines->Text.c_str());
    

    OR(好多了,因为它适用于任何长度而不会出现称为缓冲区溢出的严重安全问题)

    // C style
    // char *dum = malloc(strlen(InstList->Lines->Text.c_str())+1); 
    
    // BCB style...
    char *dum = malloc(InstList->Lines->Text.Length()+1);  
    
    // BEWARE: AFTER any malloc you should check the pointer returned for being NULL
    
    strcpy(dum,InstList->Lines->Text.c_str());
    

    编辑 - 根据 cmets:

    我假设您使用的是旧的 BCB 版本,它仍然有 AnsiString - 如果这是在较新的版本上 UnicodeString 那么代码可能会导致“奇怪的结果”,因为 unicode 字符串每个字符占用多个字节(取决于编码等)。

    【讨论】:

    • 好点,但甚至不需要使用strlen,因为InstList->Lines->Text 肯定带有长度属性。请注意,不确定 C++ Builder 语法。
    • @DavidHeffernan 我上次使用 C++ Builder 是几年前的事了……查了一下……
    • 根据文档,TextSystem::UnicodeString 并且您会从 Delphi 编写 Length(System::UnicodeString),我假设 C++ Builder 是相同的。 Text 是从 TMemo 后面的 Windows EDIT 控件的内容动态生成的。我可能会先将其读入System::UnicodeString 变量。人们只能想知道 C 字符串在哪里出现。
    • @DavidHeffernan 您适合当前版本...但例如 C++ Builder 6(!) 将其定义为AnsiString...令人难以置信,但 V 6 仍在使用中...当我看到 C 字符串处理时,我想到了旧版本,否则这段代码不会有好处...
    • @DavidHeffernan 检查了文档...System::UnicodeString 将返回 wchar_t * 作为c_str() 的结果...鉴于 OP 发布的错误消息,这似乎是带有 @ 的旧版本987654336@...
    【解决方案2】:

    不要使用char*,而是使用Stringstd::string,如果由于某种原因需要指向字符串的指针,只需从字符串对象中获取。

    String myString = InstList->Lines->Text;
    myString.c_str();
    

    【讨论】:

      【解决方案3】:
      char *dum[32];
      

      是一个长度为 32 的数组,每个元素都是一个 char*。我猜你是想写

      char dum[32];
      

      这是一个由 32 个字符组成的数组,然后您可以编写:

      strcpy(dum, InstList->Lines->Text.c_str());
      

      当然,请确保InstList->Lines->Text 不会太大以至于溢出缓冲区。

      当然,我不确定为什么需要在 C++ 程序中使用 C 字符串。

      【讨论】:

        【解决方案4】:
        字符杜姆[32]; strcpy(dum,InstList->Lines->Text.c_str());

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-30
          • 2014-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多