#include <iostream>
#include <string>
using namespace std;
int main(){
char s1[11*sizeof(char)];
strcpy(s1, "0123456789");
char s2[38*sizeof(char)];
strcpy(s2, "987654321082374583234723542346574234");
//как видно объем s2 гораздо больше s1 оттого и ошибка.
strcpy(s1,s2);
cout<<s1<<'\n';
return 0;
}
Глюки функции strcpy() или что?
#include <iostream>
#include <string>
using namespace std;
int main(){
char s1[]="0123456789";
char s2[]="987654321082374583234723542346574234;
strcpy(s1,s2);
cout<<s1<<'\n';
return 0;
}
Выдается ошибка Windows
Все просто. В первой строке выделенно меньше памяти чем во второй. Память выделяется неявно при инициализации строковой переменной. Соответственно при копировании strcpy пытается скопировать больше байт чем влазит в первую строку и выходит за отведенные ей границы.
Может более очевидно будет если переписать код на аналогичный с явным выделением памяти:
Код:
А почему тогда "987654321082" нормально копирует?
В лудшем случае результат такого "копирования" просто останется незаметен. В худшем что то сломается в самом неподходящем месте. Так что сразу надо отучаться от такого.
Да и можно изменить размер строки (куда копируется)? Если да то как?
[/QUOTE]
Свою что? Аналог strcpy? Так а зачем изобретать велосипед? Если правильно подходить к указателям и границам массивов то и проблем не будет, а если неправильно то и в самописной функции можно нарваться на такую же ошибку.
К тому же раз исспользуешь классы стандартной C++ библиотеки и боишся ошибок в Сишных функциях, почему бы не исспользовать тот же std::string вместо char *
[QUOTE=RedHeart]
Да и можно изменить размер строки (куда копируется)? Если да то как?[/QUOTE]
Для статически заданной нет нельзя.
Если динамически - сколько угодно.
Код:
char *s1 = new char[10];
delete []s1;
s1 = new char[100];
delete []s1;
s1 = new char[100];
Код:
strcpy(char* des, char* src)
ф. C:
void * maloc(size_t size) - выделение памяти
Код:
//Example:
char * str = (char *)malloc(N*sizeof(char));// выделение памяти, необходимых для размещения N величин типа char
char * str = (char *)malloc(N*sizeof(char));// выделение памяти, необходимых для размещения N величин типа char
Код:
void * realoc(void *ptr, size_t size)
ptr - указатель на участок памяти
size - новый объем
Старое содержание строки "остаеться на месте".
см. http://forum.codenet.ru/showthread.php?t=28288 5 сообщение
Удаление с помощью free();
Если С++ решишь использовать - string и ты свободен. Читай хелп, по нему и спрашивай если не понятно.
Спасибо что разъяснили Новичку ситуацию со стороками