Присвоение массиву char значения по умолчанию с помощью конструктора в классе c ++

0

Я пишу небольшую программу, которая вводит данные от пользователя. Ввод представляет собой целое число, для числа учеников, 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)); сделал трюк! Спасибо, что помогли парням :)

  • 0
    Вы должны использовать char[] ? Или вы можете использовать std::string ?
  • 0
    Просто совет: попробуйте использовать лучшие имена переменных. Я знаю, вы знаете, для чего они используются, но люди, читающие это, понятия не имеют.
Показать ещё 3 комментария
Теги:
class
arrays
constructor
char

4 ответа

1
Лучший ответ
fieldOfStudy[20] = field[20];

Вы просто назначаете char в позиции 20 из поля в fieldOfStudy. Вместо этого используйте memcpy:

memcpy(fieldOfStudy, field, sizeof(fieldOfStudy));
  • 1
    strcpy будет более эффективным, если они являются C-строками.
  • 0
    Я думаю, что memcpy быстрее, поскольку размер известен и исправлен, простые копии до нулевого ограничения.
0

Если вам нужно инициализировать 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);

  }
0

Это fieldOfStudy[20] = field[20]; линии fieldOfStudy[20] = field[20]; устанавливает char в позиции 20 в fieldOfStudy значению char в позиции 20 в field.

Имейте в виду, что fieldOfStudy является указателем на char, а char fieldOfStudy[20] просто сообщает компилятору, что будет еще 19 char после того, на который fieldOfStudy.

  • 1
    Это не указатель, это массив.
  • 0
    Спасибо @MikeSeymour, я не знал. Если что-то еще имеет такое же заблуждение: stackoverflow.com/questions/1335786/…
0

Массив символов не работает так, как вы хотите, с операторами присваивания и сравнения, поэтому был создан класс 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".

  • 0
    Спасибо, мне нужно включить какой-нибудь пакет для работы memcpy или strcpy?
  • 0
    @ Биргир: Они оба в <cstring> . Убедитесь, что вы проверили размер lina перед копированием; код в этом ответе выйдет за пределы, если он меньше 20 символов.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню