strncpy для уже созданного char []

Есть класс

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] с именем «Филипп Мачейовский», и я добавлю к нему «Адам». После оператора = (…) имя будет равно «Адамлип Мачейовски»?
Как это исправить, если так перезаписать?

0

Решение

использование strcpy() или добавить нулевой терминатор после использования strncpy(), strncpy() не добавляет нулевой терминатор (\0), в то время как strcpy() делает.

Мой совет: используйте std::string вместо c-styled завершенная нулем строка.

когда в Риме, делайте римляне!


От http://cplusplus.com

Нулевой символ не добавляется неявно в конце пункта назначения, если источник длиннее> num (таким образом, в этом случае пункт назначения не может быть строкой C с нулевым символом в конце).

поскольку Adam меньше по длине, чем Philip Maciejowskystrncpy() НЕ будет дополнять оставшийся пункт назначения (то есть Philip Maciejowsky) с \0, И, следовательно, вывод выглядит так:

Adamip Maciejowskystrcpy() или делать memset(destination, 0, lengthOfDestination) а потом звонит strncpy() приведет к тому, что ваш вывод Adam также. Несколько способов сделать то, что вы пытаетесь сделать.

1

Другие решения

Во-первых, если вы используете 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).

0

По вопросам рекламы [email protected]