Проблемы со структурами C++

245
15 января 2019, 16:00

Есть структура с двумя параметрами: слово (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;
                }
            }
        }
    }
}
Answer 1

Строки, представленные как массивы char, непосредственно не копируются. Для этого следует использовать функции типа strcpy или strcpy_s.

И, кстати, для сравнения содержимого строк (а не их указателей) следует также использовать соответствующие функции - strcmp.

Answer 2

Во-первых, содержимое массивов в С++ никак не сравнивается простым применением оператора >, поэтому ваше наивное

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?

READ ALSO
Точка входа в программу

Точка входа в программу

Почему при точке входа WinMain/wWinMain не запускается консольА при точке входа main - запускается

195
C++ установить точность вычислений для double

C++ установить точность вычислений для double

имеется данный код, но он выводит не ожидаемый результаткак это исправить?

171
бесконечный цикл (scanf), не понимаю почему

бесконечный цикл (scanf), не понимаю почему

Как-то по-уродски код вставился

199
Как вывести большие(очень большие) числа?

Как вывести большие(очень большие) числа?

Мне нужно умножать очень большие числа, сделал это через алгоритм Карацубы, но переменные просто не могут их вместить в себяКак можно преодолеть...

184