Есть класс
class Cow{
char name[20];
char* hobby;
double weight;
public:
[..]
Cow & operator=(const Cow &c);
[..]
};
и мне интересно, как написать определение operator=
метод.
Я написал определение, которое равно —
Cow & Cow::operator=(const Cow &c){
if(this==&c)
return *this;
delete [] hobby;
hobby=new char [strlen(c.hobby)+1];
weight=c.weight;
strncpy(name,c.name,20);
return *this;
}
но что, если уже есть созданное имя [20] с именем «Филипп Мачейовский», и я добавлю к нему «Адам». После оператора = (…) имя будет равно «Адамлип Мачейовски»?
Как это исправить, если так перезаписать?
использование strcpy()
или добавить нулевой терминатор после использования strncpy()
, strncpy()
не добавляет нулевой терминатор (\0
), в то время как strcpy()
делает.
Мой совет: используйте std::string
вместо c-styled
завершенная нулем строка.
когда в Риме, делайте римляне!
Нулевой символ не добавляется неявно в конце пункта назначения, если источник длиннее> num (таким образом, в этом случае пункт назначения не может быть строкой C с нулевым символом в конце).
поскольку Adam
меньше по длине, чем Philip Maciejowsky
— strncpy()
НЕ будет дополнять оставшийся пункт назначения (то есть Philip Maciejowsky
) с \0
, И, следовательно, вывод выглядит так:
Adamip Maciejowsky
— strcpy()
или делать memset(destination, 0, lengthOfDestination)
а потом звонит strncpy()
приведет к тому, что ваш вывод Adam
также. Несколько способов сделать то, что вы пытаетесь сделать.
Во-первых, если вы используете C ++, вам не следует использовать строки в стиле C, а вместо этого следует использовать класс std :: string, который упрощает все во всех отношениях.
Предполагая, что вам необходимо использовать строки char *, strncpy позаботится об этом. Строка в стиле C заканчивается нулем, что означает, что строка, такая как "test"
занимает пять байтов. Байты, в порядке, {'t', 'e', 's', t', 0}
, Нулевой (или нулевой) байт служит маркером достижения конца строки.
С man-страницы для strncpy в моей системе:
Следующее устанавливает chararray в abc\0\0\0
:
char chararray[6];
(void)strncpy(chararray, "abc", sizeof(chararray));
Так что это означает, что строка будет содержать "adam\0\0\0\0\0\0\0[etc.]"
где \0
представляет нулевой байт. Строковые функции прекращают обработку, когда они читают первый ноль (потому что, помните, что для строк в стиле C нет способа узнать длину строки, не просматривая ее в поисках \0
).