C++: использование Strcpy со строками указателей

Возможный дубликат:
Нарушение прав доступа при использовании strcpy?

Я наткнулся на то, что меня беспокоит

char* p = "Hello"; strcpy (p,"bye");

Это всегда дает мне ошибку. Итак, как я могу использовать strcpy со строками указателей.

(и, пожалуйста, никто не говорит мне использовать std::string)

Спасибо


person Mohamed Ahmed Nabil    schedule 11.08.2012    source источник


Ответы (2)


char* p = "Hello";   //BAD - OBSOLETE!
strcpy (p,"bye");

Хороший компилятор должен выдать ваше предупреждение (или ошибку) в первой строке, потому что это устарело, и язык требует, чтобы вы написали это как:

char const * p = "Hello";  //GOOD

Как только вы напишете это (что, во всяком случае, правильно), все станет ясно: p указывает на константные данные, означает, что данные, на которые указывает p, не могут быть изменено, что, в свою очередь, означает, что вы не можете перезаписать его с помощью strcpy (или вручную).

Если вы хотите перезаписать это, один из способов объявить p как массив:

char p[] = "Hello";  //OK
strcpy (p,"bye");    //OK - for any string (2nd arg) of length <= 5

В C++ следует использовать std::string, по возможности избегая char* и char[]. Таким образом, способ написания кода на С++ будет таким:

#include <string>   //must include this first

std::string p = "Hello";
p = "bye"; //overwrite it. 

Так просто!

person Nawaz    schedule 11.08.2012
comment
Так что я не должен правильно использовать strcpy с указателями? - person Mohamed Ahmed Nabil; 11.08.2012
comment
@MohamedAhmedNabil: проблема не в strcpy. Вы не можете использовать const char * или строковый литерал в качестве места назначения. - person Blastfurnace; 11.08.2012
comment
Кроме того, даже решение с p[] может вызвать проблемы, если новая строка больше той, с которой был создан массив символов. И если вы планируете использовать C++, используйте его правильно и используйте std::string, это совсем не повредит. :) - person Excelcius; 11.08.2012

Прежде всего, вы должны выделить память для своей строки, например:

char *p = new char[BUFFER_LENGTH];

Затем вы можете скопировать содержимое в него:

strcpy(p, "bye");

См. эту страницу, чтобы узнать, как она используется.

Не забудьте удалить память, когда закончите:

delete[] p;

Вы также можете предоставить дополнительную информацию, если я неправильно понял вашу проблему

person xQuare    schedule 11.08.2012
comment
например для BUFFER_LENGTH ‹br/› const int BUFFER_LENGTH = 100; - person Abhi; 11.08.2012
comment
это не то же самое, что сделать это как `char a[10]=Hello; - person Mohamed Ahmed Nabil; 11.08.2012
comment
Один выделяется динамически, другой находится в стеке, да. Это не то же самое. Однако при использовании указателей обычно требуется динамическое выделение. - person xQuare; 11.08.2012