C++ Borland char * 和 strcpy

发布于 2024-12-12 18:08:27 字数 394 浏览 3 评论 0原文

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

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

InstList is a TMemo of C++ Builder

Why am I getting this error?

[C++ Error] emulator.cpp(59): E2034 Cannot convert 'char * *' to 'char *'
Full parser context
emulator.cpp(56): parsing: void _fastcall TMain::Button1Click(TObject *)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

英雄似剑 2024-12-19 18:08:27
char *dum[32];

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

char dum[32];

This is an array of 32 char 然后你可以写:

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

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

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

char *dum[32];

is an array of length 32, each element being a char*. I guess you meant to write

char dum[32];

This is an array of 32 char and you can then write:

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

Make sure, of course, InstList->Lines->Text is not so big that it overflows your buffer.

Of course, I'm not sure why you would need to use C strings in a C++ program.

优雅的叶子 2024-12-19 18:08:27

您可以使用(容易出现称为缓冲区溢出的严重安全问题)

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

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

// 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< /code> 那么代码可能会导致“奇怪的结果”,因为 unicode 字符串每个字符占用多个字节(取决于编码等)。

You either use (prone to serious security problem called buffer overflow)

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

OR (much better since it works with any length without being prone to a serious security problem called buffer overflow)

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

EDIT - as per comments:

I am assuming that you are using an older BCB version which still has AnsiString - if this is on a newer version UnicodeString then the code could lead to "strange results" since unicode string take up multiple bytes per character (depending on the encoding etc.).

早乙女 2024-12-19 18:08:27
char dum[32];   
strcpy(dum,InstList->Lines->Text.c_str()); 
char dum[32];   
strcpy(dum,InstList->Lines->Text.c_str()); 
信仰 2024-12-19 18:08:27

不要使用 char* 使用 Stringstd::string 相反,如果您出于某种原因需要指向字符串的指针,只需从你的字符串对象。

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

Do not use char* use String or std::string instead and if you need a pointer to your string for some reason just take this from your string object.

String myString = InstList->Lines->Text;
myString.c_str();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文