Ошибка l-value - C (СИ)
Формулировка задачи:
Хочу сделать функцию, которая будет сортировать вывод строк, вот такую вот соченил:
Выдает ar[i] = ar[j]; ar[j] = buf; в этих вот местах, что перед = должно быть значение "l-value". Суть ошибки я понимаю, проблема в том, что начал просматривать, как сортировка сделана в книге Cтивена Прата, и обнаружил, что очень похоже, в частности такие выражения, в которых у меня ошибки там присутствуют.
void choose_2(unsigned char ar[][COLS], int rows) { int i, j; char *buf; for(i = 0; i < rows ; ++i) for(j = i; j < rows; ++j) if(strcmp(*(ar + i),*(ar + j)) > 0 ) { buf = ar[i]; ar[i] = ar[j]; ar[j] = buf; } }
в первом цикле нужно добавить "i < rows - 1", во втором цикле for нужно добавить "j = i + 1", но суть от этого не изменяется
Решение задачи: «Ошибка l-value»
textual
Листинг программы
#include <stdio.h> #include <string.h> #include <ctype.h> #define ROWS 10 #define COLS 40 void get_ap_to_ten(unsigned char ar[][COLS]); void choose_2(unsigned char ar[][COLS], int rows); int main() { int i; unsigned char string[ROWS][COLS] = {0}; get_ap_to_ten(string); choose_2(string, ROWS); for(i = 0; i < ROWS ;i++) fputs(string[i], stdout); } void get_ap_to_ten(unsigned char ar[][COLS]) { int i; puts("Enter up to 10 strings:"); for(i = 0; i < ROWS && fgets(ar[i],COLS,stdin) != NULL ; ++i) ; } void choose_2(unsigned char ar[][COLS], int rows) { int i, j; unsigned char *buf; for(i = 0; i < rows ; ++i) for(j = i; j < rows; ++j) if(strcmp(*(ar + i),*(ar + j)) > 0 ) { buf = ar[i]; ar[i] = ar[j]; ar[j] = buf; } }
Объяснение кода листинга программы
- В коде используется язык программирования C.
- Код содержит две функции:
get_ap_to_ten
иchoose_2
. get_ap_to_ten
принимает двумерный массивar
размеромROWS
наCOLS
и просит пользователя ввести до 10 строк.choose_2
принимает двумерный массивar
размеромROWS
наCOLS
и количество строкrows
.- В функции
main
создается двумерный массивstring
размеромROWS
наCOLS
и инициализируется значением 0. - В функции
main
вызывается функцияget_ap_to_ten
, которая заполняет массивstring
строками, введенными пользователем. - В функции
main
вызывается функцияchoose_2
, которая сортирует массивstring
в порядке возрастания. - В функции
main
выводится содержимое массиваstring
на экран. - В функции
get_ap_to_ten
используется циклfor
, который продолжается, пока пользователь вводит строки и не нажимает кнопку Enter. - В функции
choose_2
используется два вложенных циклаfor
, который сортирует строки в массивеar
по возрастанию. - В функции
choose_2
используется функцияstrcmp
, которая сравнивает две строки. - Если строка
ar[i]
больше строкиar[j]
, то строки меняются местами с помощью указателейbuf
,ar[i]
иar[j]
. - В функции
main
используется циклfor
, который выводит содержимое массиваstring
на экран. - В функции
main
не обрабатывается ошибка, возникающая при попытке чтения строки, длина которой превышает размер буфера. - В функции
main
не обрабатывается ошибка, возникающая при попытке сортировки массива, содержащего строки разной длины. - В функции
main
не обрабатывается ошибка, возникающая при попытке записи строки в файл, открытый в режиме вывода. - В функции
main
не обрабатывается ошибка, возникающая при попытке чтения строки, когда пользователь вводит символ новой строки без кавычек. - В функции
main
не обрабатывается ошибка, возникающая при попытке сортировки массива, содержащего строки, не являющиеся строками ASCII. - В функции
main
не обрабатывается ошибка, возникающая при попытке сортировки массива, содержащего строки, содержащие символы, не являющиеся буквами или цифрами. - В функции
main
не обрабатывается ошибка, возникающая при попытке сортировки массива, содержащего строки, содержащие специальные символы, например, символы управления или символы из национальных алфавитов.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д