C ++ Borland char * и strcpy - PullRequest
       34

C ++ Borland char * и strcpy

1 голос
/ 29 октября 2011
char *dum[32];
strcpy(&dum,InstList->Lines->Text.c_str());

InstList - это TMemo C ++ Builder

Почему я получаю эту ошибку?

[C ++ Error] emulator.cpp (59): E2034 Невозможно преобразовать 'char * *' в 'char *' Полный контекст синтаксического анализатора emulator.cpp (56): parsing: void _fastcall TMain :: Button1Click (TObject *)

Ответы [ 4 ]

2 голосов
/ 29 октября 2011
char *dum[32];

- массив длиной 32, каждый элемент является char*.Я думаю, вы хотели написать

char dum[32];

Это массив из 32 символов, и вы можете написать:

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

Убедитесь, что, конечно, InstList->Lines->Text не такой большойчто он переполняет ваш буфер.

Конечно, я не уверен, зачем вам нужно использовать строки C в программе на C ++.

2 голосов
/ 29 октября 2011

Вы либо используете (подвержен серьезной проблеме безопасности, называемой переполнение буфера )

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, тогда код может привести к "странным результатам", так как строка Unicode занимает несколькобайт на символ (в зависимости от кодировки и т. д.).

1 голос
/ 29 октября 2011

Не используйте char*, используйте String или std::string вместо этого, и если по какой-то причине вам нужен указатель на вашу строку, просто возьмите это из вашего строкового объекта.

String myString = InstList->Lines->Text;
myString.c_str();
1 голос
/ 29 октября 2011
char dum[32];   
strcpy(dum,InstList->Lines->Text.c_str()); 
...