我无法将定义长度的char序列数组存储到struct的对象中。我可以在不定义字符长度或只使用字符串的情况下使其工作,但它只是困扰我为什么会发生这种情况。
代码:
#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 GT;没有可以进行此转换的上下文
错误C2440:'=':无法从'const char [12]'转换为'char [10]'
答案 0 :(得分:5)
如果你想这样做,你应该使用strcpy
标题中的strncpy
(或<cstring>
)函数。
strcpy(hstable[0].name, "Kyle ");
但请考虑使用std::string
而不是普通字符数组。
注意:char[10]
太小而不能将" 01/03/88 \n"
存储为C字符串,因此您已经陷入了C
字符串提供的众多陷阱之一(缓冲区溢出)情况)。
答案 1 :(得分:4)
您无法在C ++中分配数组(字符串文字是const char
数组)。您必须逐个元素地复制它们,对于以null结尾的char数组,使用strncpy
的方法是这样做。
更好的,C ++风格的方法是将name
和date
转换为std::string
,但可以分配用明显的语法。
答案 2 :(得分:2)
这是您在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答案不适合全部包含它们......有书籍可供选择。你应该选择a good C++ book并从封面到封面阅读以学习C ++。只需在编译器中键入一些代码,希望通过逻辑和实验来学习它,就可以解决C ++的灾难。
你有多聪明并不重要......你无法以这种方式学习C ++。实际上从某种意义上说,你越聪明,越难(因为你会尝试使用逻辑来填补空白,但有些地方C ++根本就没有逻辑 - 主要是出于历史原因)。
C ++可以是一种非常好的语言,但从错误的角度来看它可能会成为你最糟糕的噩梦(好吧......无论是你的噩梦还是C ++软件用户最糟糕的噩梦)。
答案 3 :(得分:0)
std::string
strcpy()
,或者更好的是memcpy()
。