Ошибка последовательности массива символов - PullRequest
2 голосов
/ 31 июля 2011

У меня проблемы с сохранением массива последовательности символов определенной длины в объекте структуры. Я могу заставить его работать, не определяя длину символа или просто используя строку, но меня просто беспокоит, почему это происходит.

код:

#include <iostream>
#include <string>
using namespace std;

struct highscore {
char name[50];
int score;
char date[10];
} hstable[9];

void printtable (highscore show_tab) {
cout << show_tab.name << show_tab.score << show_tab.date;
};

void main() {
hstable[0].name = "Kyle ";
hstable[0].score = 100;
hstable[0].date = " 01/03/88 \n";

printtable (hstable[0]);
system("pause");
 return;

};

Ошибка:

ошибка C2440: «=»: невозможно преобразовать из «const char [6]» в «char [50]» 1> Нет контекста, в котором это преобразование возможно

ошибка C2440: '=': невозможно преобразовать из 'const char [12]' в 'char [10]'

Ответы [ 4 ]

5 голосов
/ 31 июля 2011

Если вы хотите сделать это, вы должны использовать функцию strcpy (или strncpy) из заголовка <cstring>.

strcpy(hstable[0].name, "Kyle ");

Но, пожалуйста, рассмотрите возможность использования std::string вместомассивы с обычными символами.

Примечание: char[10] слишком мал, чтобы хранить " 01/03/88 \n" как строку C, поэтому вы уже попали в одну из многих ловушек, которые предлагают строки C (переполнение буфера вэто дело).

4 голосов
/ 31 июля 2011

Вы не можете назначать массивы в C ++ (а строковый литерал представляет собой массив const char).Вы должны копировать их поэлементно, и для массивов символов с нулевым символом в конце способ сделать это - strncpy.

Гораздо лучший способ в стиле C ++сделать это было бы, чтобы превратить name и date в std::string s, которые вы можете назначить с очевидным синтаксисом.

2 голосов
/ 31 июля 2011

Это то, что вы программируете на C ++, должно более или менее выглядеть

#include <iostream>
#include <string>
#include <vector>

struct HighscoreEntry {
    std::string name;
    int score;
    std::string date;

    HighscoreEntry(const std::string& name,
                   int score,
                   const std::string& date)
        : name(name), score(score), date(date)
    { }
};

std::vector<HighscoreEntry> high_scores;

std::ostream& operator<<(std::ostream& s, const HighscoreEntry& hs) {
    return s << hs.name << " " << hs.score << " " << hs.date << "\n";
}

int main(int argc, const char *argv[]) {
    high_scores.push_back(HighscoreEntry("Kyle", 100, "01/03/88"));
    std::cout << high_scores[0];
}

Почему?Есть так много причин, по которым SO-ответ не подходит, чтобы содержать их все ... для этого есть книги.Вы должны выбрать хорошую книгу по C ++ и прочитать ее от корки до корки, чтобы выучить C ++.Просто наберите какой-нибудь код в компиляторе в надежде изучить его с помощью логики и экспериментов - это рецепт катастрофы с C ++.

Неважно, насколько вы умны ... вы не можете выучить C ++ таким образом.На самом деле, в каком-то смысле вы умнее и труднее (потому что вы будете пытаться использовать логику для заполнения пробелов, но есть места, в которых C ++ вообще не логичен - в основном по историческим причинам).

C ++ может быть очень хорошим языком, но подходите к нему с неправильной стороны, и это может стать вашим худшим кошмаром (ну ... или вашим кошмаром или худшим кошмаром для пользователей вашего программного обеспечения C ++).

0 голосов
/ 31 июля 2011
  • В C ++ вы должны использовать std::string
  • В C, чтобы скопировать строковый литерал в массив символов, используйте strcpy() или, еще лучше, memcpy().
...