有一个结构有两个参数:一个单词(str)和一个数字(cnt;不要问为什么,没关系)。已创建此结构的数组。我的目标是交换(str, cnt)这个数组中的集合,如果结果证明这些集合cnt是相等的,但按字母顺序,一个小于另一个。一旦我输入一个新char s的替换,它就会抛出一个错误“表达式必须对左侧值的更改有效”。问题是什么?
const int WORDLEN = 80;
const int MAXWORDS = 100;
struct Elem {
char str[WORDLEN + 1];
int cnt;
};
Elem list[MAXWORDS];
int last = 0;
void Letter() {
char s[WORDLEN + 1];
for (int i = 0; i < last; i++) {
for (int j = i; j < last - 1; j++) {
if (list[i].cnt == list[j + 1].cnt) {
if (list[i].str > list[j + 1].str) {
s = list[i].str;
list[i].str = list[j + 1].str;
list[j + 1].str = s;
}
}
}
}
}
表示为数组的字符串
char不会直接复制。为此,请使用strcpyor之类的函数strcpy_s。顺便说一句,要比较字符串的内容(而不是它们的指针),您还应该使用相应的函数 -
strcmp。首先,C++ 中数组的内容不会通过简单地应用 operator 以任何方式进行比较
>,所以你很天真已经没有意义了。没有“按字母顺序”比较。如果您需要按字母顺序进行比较,则可以选择
strcmp, 或memcmp, 或手动比较,具体取决于存储在数组中的内容。其次,裸数组不能被语言运算符复制,这是编译器告诉你的。但是,没有人禁止您复制整个结构
您还可以注意到它
std::swap可以交换数组,即 可以简单地完成第三,使用变量的逻辑不明确
j。当您可以在循环标题中将j + 1其考虑在内时,为什么它却在任何地方都顽固地使用+ 1在循环中易于使用
j吗?