Я пишу небольшую программу, которая вводит данные от пользователя. Ввод представляет собой целое число, для числа учеников, 2 двойных числа в качестве оценок и поле обучения, которое должно быть массивом символов максимального размера 20. Теперь, когда вы пишете класс, я не совсем уверен, как чтобы присвоить массиву символов значение по умолчанию в конструкторе.
Это то, что я написал с классом и конструктором.
class nemandi
{
public:
nemandi(int num, double g1, double g2, char field[]);
void birta();
friend bool operator <(nemandi& nem1, nemandi& nem2);
private:
int studentNumber;
double grade1;
double grade2;
double medaltal();
char fieldOfStudy[20];
};
nemandi::nemandi(int num, double g1, double g2, char field[])
{
studentNumber = num;
grade1 = g1;
grade2 = g2;
fieldOfStudy[20] = field[20];
}
Это не работает, и я не смог найти решение для этого онлайн. Может ли кто-нибудь указать мне в правильном направлении, как дать массив символов значение по умолчанию в конструкторе?
Заранее спасибо !
EDIT: Замена fieldOfStudy[20] = field[20];
с memcpy(fieldOfStudy, field, sizeof(fieldOfStudy));
сделал трюк! Спасибо, что помогли парням :)
fieldOfStudy[20] = field[20];
Вы просто назначаете char в позиции 20 из поля в fieldOfStudy. Вместо этого используйте memcpy:
memcpy(fieldOfStudy, field, sizeof(fieldOfStudy));
strcpy
будет более эффективным, если они являются C-строками.
Если вам нужно инициализировать c-строку по умолчанию в конструкторе класса, вы можете сделать следующее:
class A {
char str[20];
public:
A() {
// 'def_str' will be created only once upon
// construction of first 'A' instance
static char const def_str[] = "default string";
strcpy(str, def_str);
}
Это fieldOfStudy[20] = field[20];
линии fieldOfStudy[20] = field[20];
устанавливает char
в позиции 20 в fieldOfStudy
значению char
в позиции 20 в field
.
Имейте в виду, что fieldOfStudy
является указателем на char, а char fieldOfStudy[20]
просто сообщает компилятору, что будет еще 19 char
после того, на который fieldOfStudy
.
Массив символов не работает так, как вы хотите, с операторами присваивания и сравнения, поэтому был создан класс std :: string.
nemandi::nemandi(int num, double eink1, double eink2, const std::string& lina)
{
studentNumber = num;
einkun1 = eink1;
einkun2 = eink2;
namslina = lina;
}
или
nemandi::nemandi(int num, double eink1, double eink2, const std::string& lina)
: studentNumber(num)
, einkun1 (eink1)
, einkun2 (eink2)
, namslina (lina)
{
}
Если в вашем случае требуются массивы, вы должны использовать что-то вроде memcpy для копирования данных
nemandi::nemandi(int num, double eink1, double eink2, char lina[])
: studentNumber(num)
, einkun1 (eink1)
, einkun2 (eink2)
{
memcpy(namslina, lina, sizeof(namslina));
}
Это работает, если вы хотите, чтобы 20 символов были скопированы, и вы можете убедиться, что параметр по крайней мере такой длинный. Если вы работаете со строками с нулевым завершением в стиле C, вы должны использовать "strcpy".
<cstring>
. Убедитесь, что вы проверили размер lina
перед копированием; код в этом ответе выйдет за пределы, если он меньше 20 символов.
char[]
? Или вы можете использоватьstd::string
?