Есть структура с двумя параметрами: слово (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
, непосредственно не копируются. Для этого следует использовать функции типа strcpy
или strcpy_s
.
И, кстати, для сравнения содержимого строк (а не их указателей) следует также использовать соответствующие функции - strcmp
.
Во-первых, содержимое массивов в С++ никак не сравнивается простым применением оператора >
, поэтому ваше наивное
if (list[i].str > list[j + 1].str)
уже бессмысленно. Никакого сравнения "по алфавиту" при этом не происходит. Если вам нужно сравнение "по алфавиту", то это либо strcmp
, либо memcmp
, либо сравнение вручную, в зависимости от того, что хранится в ваших массивах.
Во-вторых, голые массивы некопируемы операторами языка, о чем вам и говорит компилятор. Однако никто вам не запрещает копировать целые структуры
Elem s = list[i];
list[i] = list[j + 1];
list[j + 1] = s;
Также можно заметить, что std::swap
умеет обменивать местами массивы, т.е. можно сделать просто
std::swap(list[i].str, list[j + 1].str);
В-третьих, не ясна логика работы с переменной j
. Зачем везде упорно используется j + 1
, когда можно было просто учесть это + 1
в заголовке цикла
for (int j = i + 1; j < last; j++)
а внутри цикла использовать просто j
?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Почему при точке входа WinMain/wWinMain не запускается консольА при точке входа main - запускается
имеется данный код, но он выводит не ожидаемый результаткак это исправить?
Мне нужно умножать очень большие числа, сделал это через алгоритм Карацубы, но переменные просто не могут их вместить в себяКак можно преодолеть...