У меня есть это назначение C, я немного борюсь в этой конкретной точке.У меня есть некоторый опыт работы с Си, но указатели и динамическое управление памятью все еще очень ускользают от меня.
Задание просит нас написать программу, которая бы имитировала поведение команды / фильтра "uniq" в UNIX.
Но проблема, с которой я сталкиваюсь, связана с функциями библиотеки C getline или getdelim (мы должны использовать эти функции в соответствии со спецификациями реализации).
В соответствии со спецификацией пользовательский ввод может содержать произвольное количество строк, а каждая строка может иметь произвольную длину (неизвестно во время компиляции).
Проблема в том, что следующая строка дляцикл while while (cap = getdelim (stream.linesArray, size, '\ n', stdin))
компилируется и как-то «работает», когда я так и оставляю.Под этим я подразумеваю, что когда я выполняю программу, я ввожу произвольное количество строк произвольной длины на каждую строку, и программа не падает, но она продолжает работать, пока я не остановлю выполнение программы (правильно ли сохранены строкив "char ** linesArray;" - другая история, в которой я не уверен.
Я хотел бы иметь возможность сделать что-то вроде while ((cap = getdelim (stream.linesArray, size, '\n ', stdin)) && (cap! = -1))
, чтобы когда getdelim не читал символы в какой-либо строке (кроме EOF или \ n), то есть в самый первый раз, когда пользователь вводитпустая строка - программа перестанет принимать больше строк из стандартного ввода (и затем выведет строки, которые были сохранены в stream.linesArray с помощью getdelim).
Проблема заключается в том, что при выполнении программы, если я выполняю командуКак я уже упоминал выше, программа дает мне «Ошибка сегментации», и, честно говоря, я не знаю, почему и как я должен это исправить (я пытался что-то с этим сделать много раз, чтобы небезрезультатно).
Для справки:
https://pubs.opengroup.org/onlinepubs/9699919799/functions/getdelim.html
https://en.cppreference.com/w/c/experimental/dynamic/getline
http://man7.org/linux/man-pages/man3/getline.3.html
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DEFAULT_SIZE 20
typedef unsigned long long int ull_int;
typedef struct uniqStream
{
char **linesArray;
ull_int lineIndex;
} uniq;
int main()
{
uniq stream = { malloc(DEFAULT_SIZE * sizeof(char)), 0 };
ull_int cap, i = 0;
size_t *size = 0;
while ((cap = getdelim(stream.linesArray, size, '\n', stdin))) //&& (cap != -1))
{
stream.lineIndex = i;
//if (cap == -1) { break; }
//print("%s", stream.linesArray[i]);
++i;
if (i == sizeof(stream.linesArray))
{
stream.linesArray = realloc(stream.linesArray, (2 * sizeof(stream.linesArray)));
}
}
ull_int j;
for (j = 0; j < i; ++j)
{
printf("%s\n", stream.linesArray[j]);
}
free(stream.linesArray);
return 0;
}