C ++ Borland char *和strcpy

时间:2011-10-29 11:45:58

标签: c++ c++builder strcpy

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 *)

  

4 个答案:

答案 0 :(得分:2)

char *dum[32];

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

char dum[32];

这是一个32字符的数组,然后你可以写:

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

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

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

答案 1 :(得分:2)

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

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());

编辑 - 根据评论:

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

请勿使用char*使用Stringstd::string,如果由于某种原因需要指向字符串的指针,请从字符串对象中取出。

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