2014-11-12 2 views
0

Я пишу небольшую программу, которая вводит данные от пользователя. Ввод представляет собой целое число, для числа учеников, 2 двойных числа в качестве оценок и поле обучения, которое должно быть массивом символов максимального размера 20. Теперь, когда я пишу класс, я не совсем уверен как задать массив символов по умолчанию в конструкторе.Предоставление массива символов по умолчанию с конструктором в классе C++

Это то, что я написал с классом и конструктором.

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

Вы должны использовать 'символ []' ? Или вы можете использовать 'std :: string'? – CoryKramer

+0

Просто подсказка: попробуйте использовать лучшие имена переменных. Я знаю, что вы знаете, для чего они используются, но люди, читающие его, понятия не имеют. –

+0

Я буду помнить об этом. И да, это говорит, что я должен использовать char [], я не имел никаких проблем с этим использованием строки. – Birgir

ответ

1
fieldOfStudy[20] = field[20]; 

Вы просто назначаете символ в позиции 20 из поля в полеOfStudy. Используйте тетсру вместо:

memcpy(fieldOfStudy, field, sizeof(fieldOfStudy)); 
+1

'strcpy' будет более эффективным, если это строки C. –

+0

Я думаю, что memcpy быстрее, поскольку размер известен и фиксирован, strcpy простых копий до нуль-terimnation. – Robert

0

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

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

+1

Это не указатель, это массив. –

+0

Спасибо @MikeSeymour, я не знал. Если у кого-либо есть такое же заблуждение: https: // stackoverflow.com/questions/1335786/c-difference-between-char-pointer-and-array – Erika

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) 
{ 
} 

Если ваш случай требует массивов, то вы должны использовать что-то вроде тетсра, чтобы скопировать данные

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? – Birgir

+0

@Birgir: Они оба находятся в ''. Перед копированием убедитесь, что вы проверяете размер 'lina'; код в этом ответе выходит за пределы, если он меньше 20 символов. –

+0

Ahh получил это, и это сработало просто отлично! Я уже написал эту программу с помощью строки, с которой у меня не было проблем, но я выполнял некоторые упражнения, которые у меня были в Интернете, и эта конкретная проблема требовала от меня использования массива символов. Спасибо за помощь ! – Birgir

0

Если вам необходимо инициализировать кесарево строку значением по умолчанию в конструкторе класса, вы можете сделать следующее:

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); 

    }