то, что вы пытаетесь сделать, не требует этого набора осложнений.В целом strncpy
будет правильно обрабатывать оба случая.Тем не менее, для образования приведу некоторый анализ
1.В вашем конструкторе PString вы вызываете конструкцию String и просите его strcpy str_intit в str.Таким образом, вы вызываете то же повреждение памяти, которое хотели избежать.вам не хватает String()
конструктора.Я предлагаю создать конструктор по умолчанию для String и удалить тот, который вы используете из PString.
String() {str[0] = 0;}
..
PString(char str_init[])
{
2.Ваш случай может быть немного изменен следующим образом:
if (strlen(str_init) > MAX_STR_SIZE) {
strncpy(str, str_init, MAX_STR_SIZE-1);
str[MAXLEN-1] = 0; // strncpy will not add '0' in this case. you need to do it yourself
}
else
strcpy(str, str_init);
выше, в предложении if вы используете str n cpy, можете ли после 'else' использовать простой strcpy.Итак, это выглядит так:
#include <cstring>
#define MAX_STR_SIZE 80
class String {
protected:
char str[MAX_STR_SIZE];
public:
String(char *str_init)
{
strcpy(str, str_init);
}
String() {
str[0] = 0;
}
};
class PString : String
{
public:
PString(char str_init[])
{
if (strlen(str_init) > MAX_STR_SIZE) {
strncpy(str, str_init, MAX_STR_SIZE-1);
str[MAX_STR_SIZE-1] = 0;
}
else
strcpy(str, str_init);
}
};